需要帮助使用shell脚本显示输出

时间:2013-06-26 07:56:41

标签: shell sed command output

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

mat rat
mat dog
mat matress

我需要显示

rat
dog
matress

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

rat
dog
ress

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

4 个答案:

答案 0 :(得分:0)

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

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

sed "s/^$up//g"

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

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

sed "s/$up//"

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

答案 1 :(得分:0)

使用awk

awk '{print $NF}' inputFile

测试:

$ cat text
mat rat
mat dog
mat matress

$ awk '{print $NF}' text
rat
dog
matress

答案 2 :(得分:0)

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

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

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

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

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

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

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

如果您不想在$up与其后的文字之间保留空格,则可以将\>替换为\s\+,其中\+与一个或多个匹配\s sed "s/^$up\s\+//" sed "s/\(\s*\)$up\s\+/\1/" 空白字符({{1}});即,

{{1}}

答案 3 :(得分:0)

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

如果您确实要分配$up等变量,则可以使用sed "s/^$up//" /path/to/file