#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