sed:“ sed 's/\-.*// ”和“ sed '/\-/s/\-.*//gw ”之间的区别

sed:“ sed 's/\-.*// ”和“ sed '/\-/s/\-.*//gw ”之间的区别

我正在学习一些简单的sed命令。

命令 #1

sed 's/\-.*//gw without' tgs.txt

命令 #2

sed '/\-/s/\-.*//gw with' tgs.txt

输出 #1

$ cat with
2. Databases 
6. Windows
 Raja

输出 #2

$ cat without 
2. Databases 
6. Windows
 Raja

它们之间的区别

$ diff with without 
$

这两个命令有什么区别?

答案1

实际上它们之间没有区别:

sed 's/\-.*//g'
sed '/\-/s/\-.*//g'

第一种形式作用于全部行,第二种形式只对匹配的行起作用/-/ 使用地址。由于采取的操作包括-,因此实际上这两条线都只会影响包含 的线-

现在如果您改用/Raja/作为地址,那么您只会看到最后一行with- 也就是说,只有包含Raja并执行了替换的行。

答案2

这两个 sed 命令,

sed 's/\-.*//g'
sed '/\-/s/\-.*//g'

会做同样的工作。让我解释一下如何……

sed 's/\-.*//g'

将从 到 最后一个字符的所有字符替换-为空字符串。如果某一行没有任何-字符,则不会发生替换。也就是说,它不会影响没有连字符的行-

sed '/\-/s/\-.*//g'

首先会搜索包含-符号的行。如果找到,则会对-这些行进行替换(将从 到最后一个字符的所有字符替换为空字符串)。

因此两者都是相同的。您的第一个 sed 命令就足够了。您不需要输入搜索条件。此外,由于-不是特殊字符,因此您不需要对其进行转义。

相关内容