我有这个 UNIX 脚本,分两步完成我所需要的操作,即在两个不同模式(PAT1 和 PAT2)之间的预选文本中打印以模式(x 后跟数字)开头的选定行:
1) 两种不同模式(PAT1 和 PAT2)之间的预选文本,不包括带有 PAT1 和 PAT2 的行 -基于这篇文章
sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' file.txt > newfile.txt
2) 在预选文本中打印以模式(x 后跟数字)开头的选定行
sed -n '/^x [[:digit:]]*/p' newfile.txt > newfile2.txt
有没有一种方法可以一步获得相同的结果?
我已经尝试过这个脚本,但它不起作用(代码保持阻塞状态):
sed -e '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' ; '/^x [[:digit:]]*/p' file.txt > newfile.txt
我正在 OSX 上工作,而不是 Linux。
答案1
只需对第一个操作稍作调整sed
即可:
sed -n '/PAT1/,/PAT2/{/^x [[:digit:]]*/p;}' file.txt > newfile.txt
- 可能不需要尝试排除
PAT1
& ,除非它们与以下PAT2
情况出现在同一行:^x [0-9]
sed -n '/PAT1/,/PAT2/{/PAT1\|PAT2/!{/^x [0-9]*/p;};}' file.txt
还将排除PAT1
&PAT2
以下内容似乎没有执行任何操作的原因:
sed -e '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' ; '/^x [[:digit:]]*/p'
^
是第一个命令(sed
)没有从文件接收任何输入,因此正在等待来自standard input
键盘的输入。
分号不带引号,它构成 shell 语法的一部分,用于解释您提供的命令。简单来说,上面这行的意思是:execute a command named 'sed', then execute a command named '/^x [[:digit:]]*/p'
– 这是没有意义的。