我有这个简单的平台文件(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]*//' --> 删除每行开头的空格。