如何使用sed将一行中的第一个单词与最后一个单词进行比较?

时间:2015-02-04 10:06:07

标签: regex unix sed

假设我有一个看起来像这样的文件:

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

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

sed '/if_firstword_eq_lastword/do_something/'

只有SLE PLEASEE

TNX

1 个答案:

答案 0 :(得分:4)

使用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可能会失败。