grep 在具有指定字符串的两行之间

grep 在具有指定字符串的两行之间

我有这个简单的平台文件(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 oneliner:

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

其中说:

  • 如果test1找到,则增加文件编号并开始输出(即转on
  • 如果打开,则打印行到文件名“newfileFILE.txt”,其中 FILE 是文件号。
  • 如果test2找到,则结束输出(即关闭)

newfile.txt然后,您可以使用 shell 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]*//' --> 删除每行开头的空格。

相关内容