【问题标题】:how to compare first word in a line with the last word using sed?如何使用sed比较一行中的第一个单词和最后一个单词?
【发布时间】:2015-04-03 19:26:01
【问题描述】:

假设我有一个文件 F1,如下所示:

abc2 1 def2 3 abc2
123 zy
 cd eabc1d rq12345 cd
a a
a1a a1

我想检查一行中的第一个单词是否等于最后一个单词,以及是否要做某事....我如何编写这个正则表达式来检查它们是否相等? :/

sed '/if_firstword_eq_lastword/do_something/'

只有 SED PLEASEE

tnx

【问题讨论】:

    标签: regex unix sed


    【解决方案1】:

    使用 awk。

    $ awk '$1==$NF' file
    abc2 1 def2 3 abc2
     cd eabc1d rq12345 cd
    a a
    

    通过 sed,

    $ sed -n '/^ *\([^[:space:]]\+\)\b.* \1 *$/p' file
    abc2 1 def2 3 abc2
     cd eabc1d rq12345 cd
    a a
    

    正则表达式解释:

    ^ - 断言我们处于起步阶段。

    <space>* - 匹配零个或多个空格字符。

    \(...\) - 称为捕获组。与捕获组中存在的模式匹配的字符将存储在相应的组索引中。我们可以稍后通过反向引用来引用这些字符。

    [^[:space:]] 匹配非空格字符。 [^[:space:]]\+ 匹配一个或多个非空格字符。 \([^[:space:]]\+\) 现在匹配的字符被第一个捕获组捕获。

    \b 称为单词边界,匹配单词字符和非单词字符。这会强制[^[:space:]]\+ 匹配上例中的空格。

    .* 匹配任意字符零次或多次。

    <space>\1, \1 这里指的是组索引 1 内的字符。<space>\1 确保在第一个字符之前必须有一个空格。

    <space>* 匹配零个或多个空格。

    $ 断言我们已经结束了。

    请注意,如果输入包含除空格字符之外的非单词字符,则上述 sed 可能会失败。

    【讨论】:

    • +1 为 awk 答案,这就是要走的路!我不明白为什么这应该依赖于 sed,因为它太复杂了。
    • @AvinashRaj 好人!你能解释一下正则表达式是什么意思吗?我的意思是它的不同部分?我会将此作为正确答案:)
    • @nickshmick 你的教授教你一些没用的东西。您永远不会为此使用 sed,这是 awk 的工作。如果在线上只有 1 个单词,sed 解决方案将失败,而 awk 解决方案不会,并且 sed 解决方案将仅适用于某些 sed,而 awk 解决方案将适用于任何 awk(当然,旧的、损坏的 awk 除外)。
    • @EdMorton 我想我可以同意我现在会以这种方式使用它,但这就是它在学校的工作方式..
    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多