【问题标题】:delete everything before pattern including pattern using awk or sed删除模式之前的所有内容,包括使用 awk 或 sed 的模式
【发布时间】:2013-10-03 13:08:19
【问题描述】:
aaa aaaa aaaa aaaa
sss ssss ssss ssss
ddd dddd dddd dddd
fff ffff ffff ffff
abc pattern asd fde 
111 222 333 444 555
666 777 888 999 000

期望的输出:如果

111 222 333 444 555
666 777 888 999 000

【问题讨论】:

  • 尽量不要根据您要从文件中删除的内容来思考和指定问题,而是要根据您要从文件中选择的内容来思考和指定问题 - 它通常会对可读性、可维护性产生影响等您(和我们)针对您的问题提出的解决方案。

标签: unix awk sed pattern-matching


【解决方案1】:

只要找到模式就设置一个标志。从那一刻起,打印以下行:

$ awk 'p; /pattern/ {p=1}' file
111 222 333 444 555
666 777 888 999 000

也可以

awk '/pattern/ {p=1;next}p' file

它在每一行中查找pattern。找到时将变量p设置为1。棘手的一点是p>0时才打印行,所以会打印以下行。

这是How to select lines between two patterns? 的特定情况,当没有第二个模式时。

【讨论】:

  • next 可以保存...awk 'p;/pattern/{p=1}' ;)
  • 我必须说,您的原始答案更容易阅读和理解。特别是如果脚本很长。
  • awk 'p; /pattern/ {p=1}' 文件
  • 请注意,当根本找不到模式时,这会删除所有内容。
  • @MartinvonWittich 你是对的。为防止这种情况,您可以读取该文件两次:一次查看是否找到该模式并设置一个标志。然后,完全打印或从模式打印:awk 'FNR==NR {if (/pattern/) found=1; next} p || !found; /pattern/ {p=1}' file file
【解决方案2】:
sed '1,/pattern/d' file

适用于您的示例。

sed '0,/pattern/d' file

更可靠。

【讨论】:

  • 是的。除非在第一行找到pattern。最好以0 开头。
  • @Birei 不错的建议。 !
  • 请注意,当根本找不到模式时,这会删除所有内容。
【解决方案3】:

另一种sed解决方案:

sed ':loop;/pattern/{d};N;b loop' file.txt

【讨论】:

  • 这似乎是唯一在找不到模式时不会删除所有内容的解决方案。
猜你喜欢
  • 2012-02-10
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
相关资源
最近更新 更多