Используйте sed с игнорированием при добавлении текста перед некоторым шаблоном
sed -i '/first/i This line to be added'
В этом случае, как игнорировать регистр при поиске pattern = first
Ответы
Ответ 1
Вы можете использовать следующее:
sed 's/[Ff][Ii][Rr][Ss][Tt]/last/g' file
В противном случае у вас есть флаги /I
и n /I
:
sed 's/first/last/Ig' file
От человека sed:
I
я
Модификатор я для соответствия регулярному выражению является расширением GNU, которое делает sed match regexp нечувствительным к регистру.
Test
$ 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
Ответ 2
GNU sed
sed '/first/Ii This line to be added' file
Ответ 3
Вы можете попробовать
sed 's/first/somethingelse/gI'
Ответ 4
если вы хотите сохранить некоторую типизацию, попробуйте awk. Я не думаю, что у sed есть этот вариант
awk -v IGNORECASE="1" '/first/{your logic}' file
Ответ 5
Для версий awk, которые не понимают специальную переменную IGNORECASE
, вы можете использовать что-то вроде этого:
awk 'toupper($0) ~ /PATTERN/ { print "string to insert" } 1' file
Преобразуйте каждую строку в верхний регистр, прежде чем тестировать, соответствует ли она шаблону, и если это так, напечатайте строку. 1
- кратчайшее истинное условие, поэтому 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
.
Ответ 6
Используйте следующее, \b для границы слова
sed 's/\bfirst\b/This line to be added/Ig' file