1

请帮助我解决以下问题。我有一个文件:

mat rat
mat dog
mat matress

我需要显示

rat
dog
matress

我已经用sed命令编码来显示输出:(sed "s/$up//g"$up包含mat)。但是使用这个命令,我得到的输出为

rat
dog
ress

我该怎么做才能解决这个问题?
请帮忙。

4

4 回答 4

0

/g标志尝试对每一行多次应用替换命令。前两行很好,因为这个词只出现一次,但对于第三行,它将删除两者。

您可以使用零宽度断言更具体地解决它,例如^或 GNU 扩展\b,例如:

sed "s/^$up//g"

或者

sed "s/$up\b//g"

虽然更容易删除标志,例如:

sed "s/$up//"

在所有三种情况下,结果都是相同的,至少对于这种简单的例子。

于 2013-06-26T09:11:29.837 回答
0

sed 's/^mat //' /path/to/file应该做的伎俩。请注意,没有g; 它是s/foo/bar; 不是s/foo/bar/g。此外,^将替换固定在每行的开头。

如果您确实分配了一个变量,例如$up,您可以使用sed "s/^$up//" /path/to/file.

于 2013-08-15T23:48:16.070 回答
0

您当前的命令将删除$up任何位置的所有实例,包括一行中的多次出现和一行中间的出现。

如果您只想匹配$up一行的开头,并且仅当它是一个完整的(以空格分隔的)单词时,请尝试以下命令:

sed "s/^$up\>//"

在 GNU sed 中,断言^匹配行的开头,并\>匹配单词的结尾(非空白字符和空白字符之间的零宽度“字符”)。

如果之前可能有空格$up,您可以使用

sed "s/\(\s*\)$up\>/\1/"

这将仅删除$up并保留所有空格。

如果您不想在$up其后的文本之间保留空格,可以替换\>\s\+,它匹配一个或多个 ( \+) 空格字符 ( \s);IE,

sed "s/^$up\s\+//"
sed "s/\(\s*\)$up\s\+/\1/"
于 2013-06-26T20:58:33.020 回答
0

使用awk

awk '{print $NF}' inputFile

测试:

$ cat text
mat rat
mat dog
mat matress

$ awk '{print $NF}' text
rat
dog
matress
于 2013-06-26T10:17:22.347 回答