У меня есть этот простой файл 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]*//' --> удалить пробелы в начале каждой строки.