选择以两个不同模式之间的预选文本中的模式开头的行

选择以两个不同模式之间的预选文本中的模式开头的行

我有这个 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'– 这是没有意义的。

相关内容