Добавление пустых пробелов в строке до и после соответствия шаблону «строка»

#regex #linux #sed

#регулярное выражение #linux #sed

Вопрос:

Я пытаюсь добавить 5 пустых пробелов в текстовый файл (text.txt ) до и после совпадения строковых шаблонов. Я использовал следующее, чтобы получить пробелы после совпадения ‘string’, которое сработало для меня-

 sed '/string/{G;G;G;G;G;}' text.txt
 

Я хочу применить ту же команду sed, чтобы получить 5 пустых строк перед ‘string’ Здесь мне не нужны пробелы, а скорее пустые строки до и после них. Есть предложения?

Комментарии:

1. Попробуйте sed -e '/string/{ s/^/nnnnn/; s/$/nnnnn/ }' text.txt

Ответ №1:

 sed -r 's/(^.*)(string)(.*$)/1nnnnn2nnnnn3/' text.txt
 

Используйте -r или -E, чтобы разрешить регулярные выражения, разделите лайки на три раздела, а затем замените строку на первый раздел, 5 новых строк, второй раздел, 5 новых строк и, наконец, третий раздел.

Комментарии:

1. Предположим, если я хочу сделать это со многими строками для ‘string 1’, ‘string 2’ и ‘string 3’ в одном и том же text.txt . Как я могу изменить?

2. Используйте -r или -E , чтобы включить EREs (расширенные регулярные выражения). Для максимальной переносимости, в зависимости от POSIX, используйте -E .

3. Возможно sed 's/string1|string2|string3/nnnnnamp;nnnnn/g' file , это сработает для GNU sed?

Ответ №2:

Используйте этот однострочник Perl:

 perl -pe 's/string/nnnnn$amp;nnnnn/' text.txt
 

Однострочник Perl использует эти флаги командной строки:
-e : Указывает Perl искать код в строке, а не в файле.
-p : Перебирайте входные данные по одной строке за раз, присваивая им значение $_ по умолчанию. Добавляйте print $_ после каждой итерации цикла.

s/PATTERN/REPLACEMENT/ : изменить PATTERN на REPLACEMENT .
$amp; : совпадающий шаблон.
n : символ новой строки.

СМОТРИТЕ ТАКЖЕ:
perldoc perlrun : как запустить интерпретатор Perl: переключатели командной строки
perldoc perlrequick : Быстрый запуск регулярных выражений Perl

Ответ №3:

Для совпадения с одной строкой:

 $ sed -e '/string/{ s/^/nnnnn/; s/$/nnnnn/ }' text.txt 
 

Для нескольких строк, предполагающих одинаковые требования:

 $ sed -E '/(string1|string2|string3)/{ s/^/nnnnn/; s/$/nnnnn/ }' text.txt
 

Ответ №4:

Это может сработать для вас:

 sed '/string/{G;s/(string)(.*)(.)/333331333332/}' file
 

Сопоставьте string , добавьте пустую строку, сопоставьте шаблон, используя новую строку, чтобы разделить совпадение на 5 строк с каждой стороны.

Ответ №5:

И еще одна awk версия:

 awk '{if(/string1|string2|.../){printf "nnnnn%snnnnn",$0}else{print}}' file