我正在学习一些简单的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 命令就足够了。您不需要输入搜索条件。此外,由于-
不是特殊字符,因此您不需要对其进行转义。