Как вставить строку, используя sed перед шаблоном и после номера строки? - PullRequest
28 голосов
/ 09 июня 2011

Как вставить строку в файл, используя sed перед шаблоном и после номера строки? И как использовать то же самое в сценарии оболочки?

Вставляет строку перед каждой строкой с шаблоном:

sed '/Sysadmin/i \ Linux Scripting' filename.txt

И это меняется, используя диапазон номеров строк:

sed '1,$ s/A/a/'

Итак, как теперь использовать их оба (что я не смог), чтобы вставить строку в файл, используя sed перед шаблоном и после номера строки или другим подходом?

Ответы [ 4 ]

26 голосов
/ 09 июня 2011

Вы можете написать файл сценария sed и использовать:

sed -f sed.script file1 ...

Или можете использовать (несколько) -e 'command' параметров:

sed -e '/SysAdmin/i\
Linux Scripting' -e '1,$s/A/a/' file1 ...

Если вы хотите добавить что-топосле строки:

sed -e '234a\
Text to insert after line 234' file1 ...
8 голосов
/ 09 июня 2011

Я предполагаю, что вы хотите вставить строку перед шаблоном, только если номер текущей строки больше некоторого значения (т. Е. Если шаблон встречается до номера строки, ничего не делать)

Если вы непривязан к sed:

awk -v lineno=$line -v patt="$pattern" -v text="$line_to_insert" '
    NR > lineno && $0 ~ patt {print text}
    {print}
' input > output
0 голосов
/ 03 января 2019

Simple?От строки 12 до конца:

sed '12,$ s/.*Sysadmin.*/Linux Scripting\n&/' filename.txt
0 голосов
/ 07 октября 2016

Вот пример того, как вставить строку перед строкой в ​​файле:

пример файла test.txt:

hello line 1
hello line 2
hello line 3

script:

sed -n 'H;${x;s/^\n//;s/hello line 2/hello new line\n&/;p;}' test.txt > test.txt.2

выходной файл test.txt.2

hello line 1
hello new line
hello line 2
hello line 3

Внимание!обратите внимание, что sed имеет в качестве начала замену новой строки на отсутствие пробела - это необходимо, в противном случае результирующий файл будет иметь одну пустую строку в начале

Сценарий находит строку, содержащую «hello line 2», затемвставляет новую строку выше - "привет новая строка"

объяснение команд sed:

sed -n:
suppress automatic printing of pattern space

H;${x;s/test/next/;p}

/<pattern>/  search for a <pattern>
${}  do this 'block' of code
H    put the pattern match in the hold space
s/   substitute test for next everywhere in the space
x    swap the hold with the pattern space
p    Print the current pattern hold space. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...