【问题标题】:Search first occurrence and print until next delimiter, but match whole word only搜索第一次出现并打印到下一个分隔符,但仅匹配整个单词
【发布时间】:2016-08-09 22:05:37
【问题描述】:

我有一个包含多行文本的文件,类似于:

foo
1
2
3
bar
fool
1
2
3
bar
food
1
2
3
bar

到目前为止,以下给了我一个更接近的答案:

sed -n '/foo/,/bar/ p' file.txt | sed -e '$d'

...但是如果遇到“食物”或“傻瓜”之类的词,它会因为引入重复而失败。我想让上面的代码只匹配整个单词(即 grep -w),但插入 \b 开关似乎不起作用:

sed -n '/foo/\b,/bar/ p' file.txt | sed -e '$d'

我想打印“foo”之后的任何内容(包括第一个 foo)直到“bar”,但只匹配“foo”,而不是“foo1”。

【问题讨论】:

标签: bash sed


【解决方案1】:

使用正则表达式标记^$ 分别表示一行的开始和结束:

sed -n '/^foo$/,/^bar$/ p' file.txt

【讨论】:

  • ...但是是否可以扩展它以处理诸如“Name=foo”之类的前面或后面的非单词组成字符并算作肯定匹配? @heemayl
  • @supertonic09 是的,可能..检查sed -n '/^[^[:alpha:]]*foo[^[:alpha:]]*/,/^[^[:alpha:]]*bar[^[:alpha:]]*/ p' file.txt 是否适合您..
  • 我最终采用了不同的方法,并决定将逻辑分成两部分,如下所示:foo_match=$(grep -m 1 -w foo file.txt);sed -n "/$foo_match/,/bar/ p" file.txt | sed -e '$d' 但当然,上述实现对我有用@heemayl,因为我'我希望最终的应用程序包含一个比foo 更复杂的字符串,使其在传递给sed 时是唯一的。
【解决方案2】:
sed -n '/\<foo\>/,/\<bar\>/ p' file.txt

如果 foo 和 bar 必须是任何一行的第一个单词,则可能是这样。

sed -n '/^\<foo\>/,/^\<bar\>/ p' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多