Вырезать совпадающую строку и X последовательных строк до новой строки и вставить в файл - PullRequest
0 голосов
/ 04 июля 2019

Я хотел бы сопоставить все строки в файле, содержащем слово, и взять все строки до появления двух двух символов новой строки подряд.

У меня есть следующий код sed для вырезания и вставки определенных строк, но не последующих строк:

sed 's|.*|/\\<&\\>/{w results\nd}|' teststring | sed -file.bak -f - testfile

Как я могу изменить это, чтобы взять все последующие строки?

Например, скажем, я хотел сопоставить строки с «собакой», следующие три строки должны занять первые 5 строк:

The best kind of an animal is a dog, for sure
-man's best friend
-related to wolves

Racoons are not cute

Есть ли способ сделать это?

Ответы [ 4 ]

1 голос
/ 04 июля 2019

Это должно сделать:

awk '/dog/ {f=1} /^$/ {f=0} f {print > "new"} !f {print > "tmp"}' file && mv tmp file

Он установит f в значение true, если найдено слово dog, а если найдена пустая строка, установить f в значение false.
Еслиf имеет значение true, печатать в файл new.
Если f имеет значение false, печатать в файл tmp.
Копировать tmp файл в исходный файл

Редактировать: Можноукоротить немного:

awk '/dog/ {f=1} /^$/ {f=0} {print > (f?"new":"tmp")}' file && mv tmp file

Edit2: в соответствии с запросом добавить пробел для каждого раздела в файле new:

awk '/dog/ {f=1;print ""> "new"} /^$/ {f=0} {print > (f?"new":"tmp")}' file && mv tmp file

Если исходные файлы содержат табуляции или пробелы вместо простопустая строка после каждой секции собаки, измените с /^$/ на /^[ \t]*$/

1 голос
/ 04 июля 2019

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

sed 's|.*|/\\<&\\>/ba|' stringFile | 
sed -f - -e 'b;:a;w resultFile' -e 'n;/^$/!ba' file

Создайте набор регулярных выражений из stringFile и отправьте совпадения на :a. Затем запишите соответствующую строку и все последующие строки до пустой строки (или конца файла) в файл результатов.

N.B. Результаты могут быть отправлены непосредственно в resultFile, используя:

sed 's#.*#/\\<&\\>/ba#' stringFile |
sed -nf - -e 'b;:a;p;n;/^$/!ba' file > resultFile

Чтобы вырезать совпадения из исходного файла, используйте:

sed 's|.*|/\\<&\\>/ba|' stringFile |
sed -f - -e 'b;:a;N;/\n\s*$/!ba;w resultFile' -e 's/.*//p;d' file
0 голосов
/ 04 июля 2019

Это то, что вы пытаетесь сделать?

$ awk -v RS= '/dog/' file
The best kind of an animal is a dog, for sure
-man's best friend
-related to wolves
0 голосов
/ 04 июля 2019

Не могли бы вы попробовать следующее.

awk '/dog/{count="";found=1} found && ++count<4'  Input_file > temp && mv temp Input_file
...