Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用sed比较一行中的第一个单词和最后一个单词?_Regex_Unix_Sed - Fatal编程技术网

Regex 如何使用sed比较一行中的第一个单词和最后一个单词?

Regex 如何使用sed比较一行中的第一个单词和最后一个单词?,regex,unix,sed,Regex,Unix,Sed,假设我有一个文件F1,看起来像这样: abc2 1 def2 3 abc2 123 zy cd eabc1d rq12345 cd a a a1a a1 我想检查一行中的第一个单词是否等于最后一个单词,以及它是否用于做某事……我如何编写这个正则表达式来检查它们是否相等/ sed '/if_firstword_eq_lastword/do_something/' 唯一的快乐 tnx使用awk $ awk '$1==$NF' file abc2 1 def2 3 abc2 cd eabc1d

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

abc2 1 def2 3 abc2
123 zy
 cd eabc1d rq12345 cd
a a
a1a a1
我想检查一行中的第一个单词是否等于最后一个单词,以及它是否用于做某事……我如何编写这个正则表达式来检查它们是否相等/

sed '/if_firstword_eq_lastword/do_something/'
唯一的快乐

tnx使用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:]\+\)
现在匹配的字符由第一个捕获组捕获

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

*
与任何字符零次或多次匹配

\1
\1
这里指的是组索引1中的字符<代码>\1确保第一个字符前必须有空格

*
匹配零个或多个空格

$
断言我们已经走到了尽头

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

使用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:]\+\)
现在匹配的字符由第一个捕获组捕获

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

*
与任何字符零次或多次匹配

\1
\1
这里指的是组索引1中的字符<代码>\1确保第一个字符前必须有空格

*
匹配零个或多个空格

$
断言我们已经走到了尽头


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

+1对于awk答案,就是这样!我不明白为什么这应该是sed-dependent,因为它太复杂了。@AvinashRaj这是个伟大的人!你能解释一下正则表达式是什么意思吗?我是说它的不同部分?我认为这是正确的答案:)@nickshmick你的教授教你一些无用的东西。你永远不会用sed来做这个,这是awk的工作。如果行中只有一个单词,sed解决方案将失败,而awk解决方案不会,sed解决方案将只适用于某些sed,而awk解决方案将适用于任何awk(当然,旧的、坏的awk除外)。@EdMorton我想我可以同意我现在将以这种方式使用它,但这就是它在学校的工作方式。+1对于awk答案,这就是路!我不明白为什么这应该是sed-dependent,因为它太复杂了。@AvinashRaj这是个伟大的人!你能解释一下正则表达式是什么意思吗?我是说它的不同部分?我认为这是正确的答案:)@nickshmick你的教授教你一些无用的东西。你永远不会用sed来做这个,这是awk的工作。如果行中只有一个单词,sed解决方案就会失败,而awk解决方案不会,sed解决方案只能与一些sed一起工作,而awk解决方案可以与任何awk一起工作(当然,旧的、坏的awk除外)。@EdMorton我想我可以同意我现在将以这种方式使用它,但这就是它在学校的工作方式。。