grep между двумя строками с указанной строкой

grep между двумя строками с указанной строкой

У меня есть этот простой файл plat (file.txt)

a43
test1
abc
cvb
bnm
test2
test1
def
ijk
xyz
test2
kfo

Мне нужны все строки между test1 и test2 в двух формах, первая создает два новых файла, например

новыйфайл1.txt:

test1
abc
cvb
bnm
test2

новыйфайл2.txt

test1
def
ijk
xyz
test2

а вторая форма создает только один новый файл, например:

новыйфайл.txt

test1abccvbbnmtest2
test1abccvbbnmtest2

У вас есть какие-либо предложения?

Для второй формы я использовал это

sed -n '/test1/,/test2/p' file.txt > newfile.txt

Но это дало мне такой результат

test1abccvbbnmtest2test1abccvbbnmtest2

Мне нужна обратная линия типа:

test1abccvbbnmtest2
test1abccvbbnmtest2

решение1

Однострочник на awk для первого случая:

awk '/^test1/{file++; on=1} on{print >("newfile" file ".txt")} /^test2/{on=0}' file.txt

в котором говорится:

  • Если test1файл найден, увеличить его номер и начать вывод (т.е. включить on)
  • Если включено, вывести строку с именем файла «newfileFILE.txt», где FILE — номер файла.
  • Если test2найдено, завершить вывод (т.е. выключить)

Затем вы можете преобразовать два файла newfile.txtс помощью оболочки oneliner:

for file in newfile?.txt; do tr -d '\n' <$file; echo; done > newfile.txt

который говорит: для каждого файла удалить все переводы строк.

решение2

Для второй формы:

sed -n '/test1/,/test2/p' file.txt | xargs > newfile.txt ; sed 's/test2/&\n/g' newfile.txt | sed -e 's/^[ \t]*//'
  • sed -n '/test1/,/test2/p' file.txt --> захватить текст между test1 и test2
  • xargs > newfile.txt --> по сути, преобразует текст в «строку», хотя цель xargs, возможно, иная.
  • sed 's/test2/&\n/g' newfile.txt --> добавить новую строку после шаблона "test2"
  • sed -e 's/^[ \t]*//' --> удалить пробелы в начале каждой строки.

Связанный контент