请帮我解决以下问题。我有一个文件:
mat rat
mat dog
mat matress
我需要显示
rat
dog
matress
我用sed
命令编码显示输出:sed "s/$up//g"
($up
将包含mat
)。但是使用这个命令,我得到输出为
rat
dog
ress
我该怎么做才能解决这个问题? 请帮忙。
答案 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
。