-1

我正在阅读这个问题如何使用条件表达式来选择数据?

给出的 sed 解决方案是

sed -r '1d;/(\S+\s+){5}\S+/!d;/\+$/s/\S+\s+//5;/-$/s/\S+\s+//4' file

我无法理解这些位

1d;- 这个 statmenet 是做什么的

/(\S+\s+){5}\S+/- 它匹配任何非空白字符 5 次,再匹配 1 次

!d不知道这是做什么的

/\+$/这意味着任何以 + 结尾的东西

s/\S+\s+//5;不知道

/-$/ 它搜索以 - 结尾的任何内容

s/\S+\s+//4'不知道

4

1 回答 1

0

1d;

这只是删除了第一行。

/(\S+\s+){5}\S+/!d;

这匹配任何(非空白字符 [ \S] 一次或多次 [+​​] 后跟任何空白字符 [ \s] 一次或多次 [ +])5 次 [ {5}],然后是非空白字符 [ \S] 一次或多次[ +] 并删除不包含匹配项 [ ] 的任何行的整行!d

该语法/pattern/d将搜索您的模式并删除包含该模式的所有行。将其更改为/pattern/!d相反,因为它会删除任何不包含该匹配项的行。

/\+$/s/\S+\s+//5;

这将搜索 pattern \+$,它匹配任何以文字加号结尾的行。s/\S+\s+//5然后它在这些行上执行操作。该命令的作用是搜索模式\S+\s+(您应该能够根据最后一条语句的解释来解释),并删除每行匹配的第五次出现(不是整行,请注意,只是匹配位)。

这里工作的基本语法是s/pattern/replacement/. 因为替换留空,所以具有删除匹配的效果。将语法更改为s/pattern/replacement/n仅替换第 n 次出现。

/-$/s/\S+\s+//4;

这几乎与上述相同,除了它正在搜索以减号结尾的行,然后在这些行上删除该模式的第四次出现。

HTH。

于 2013-01-18T14:55:50.533 回答