Используйте sed с игнорированием регистра при добавлении текста перед некоторым шаблоном

sed -i '/first/i This line to be added' 

В этом случае, как игнорировать регистр при поиске шаблона = first


person MaNn    schedule 04.06.2013    source источник


Ответы (6)


Вы можете использовать следующее:

sed 's/[Ff][Ii][Rr][Ss][Tt]/last/g' file

В противном случае у вас есть флаги /I и n/i:

sed 's/first/last/Ig' file

От человека sed:

Я

я

Модификатор I для сопоставления с регулярным выражением — это расширение GNU, которое позволяет sed сопоставлять регулярное выражение без учета регистра.

Контрольная работа

$ cat file
first
FiRst
FIRST
fir3st
$ sed 's/[Ff][Ii][Rr][Ss][Tt]/last/g' file
last
last
last
fir3st
$ sed 's/first/last/Ig' file
last
last
last
fir3st
person fedorqui 'SO stop harming'    schedule 04.06.2013
comment
Ты прав!!! Но я ищу любую другую опцию. Как и в команде grep, у нас есть опция -i для игнорирования -case - person MaNn; 04.06.2013
comment
Я нашел кое-что в stackoverflow.com/q/2157288/1983854 . Проверьте мой обновленный ответ. - person fedorqui 'SO stop harming'; 04.06.2013
comment
/i /I для gnu sed и только для s/../../ (substitution operation), если я правильно помню. не работает для /.../p например - person Kent; 04.06.2013
comment
Да Кент, Вы правы. /I и /i Это работает только для операции подстановки - person MaNn; 04.06.2013
comment
Да, я вижу @Kent. Я пробовал для этого случая stackoverflow.com/q/16836306/1983854 и не работает. - person fedorqui 'SO stop harming'; 04.06.2013
comment
@fedorqui Я был неправ. /.../Ip тоже работало. ... следует проверить, а затем оставить комментарий ... но опять же, для gnu sed. +1 ваш ответ. - person Kent; 04.06.2013
comment
@Кент Это /.../I p; почти уверен, что вам нужен пробел после модификаторов. Это работает для всех регулярных выражений, а не только для замены. - person Zenexer; 29.01.2015

GNU-сед

sed '/first/Ii This line to be added' file
person Endoro    schedule 04.06.2013

Можешь попробовать

sed 's/first/somethingelse/gI'
person bendaizer    schedule 04.06.2013

если вы хотите сэкономить на наборе текста, попробуйте awk. Я не думаю, что у sed есть такая возможность

 awk -v IGNORECASE="1" '/first/{your logic}' file
person Kent    schedule 04.06.2013

Для версий awk, которые не понимают специальную переменную IGNORECASE, вы можете использовать что-то вроде этого:

awk 'toupper($0) ~ /PATTERN/ { print "string to insert" } 1' file

Преобразуйте каждую строку в верхний регистр, прежде чем проверять, соответствует ли она шаблону, и если да, напечатайте строку. 1 — это самое короткое условие true, поэтому awk делает то, что по умолчанию: { print }.

Чтобы использовать переменную, вы можете пойти с этим:

awk -v var="$foo" 'BEGIN { pattern = toupper(foo) } toupper($0) ~ pattern { print "string to insert" } 1' file

Это передает переменную оболочки $foo и преобразует ее в верхний регистр перед обработкой файла.

Немного короче с bash было бы использовать -v pattern="${foo^^}" и пропустить блок BEGIN.

person Tom Fenech    schedule 29.04.2016

Используйте следующее, \b для границы слова

sed 's/\bfirst\b/This line to be added/Ig' file
person Saurabh    schedule 12.10.2019