请帮助我解决以下问题。我有一个文件:
mat rat
mat dog
mat matress
我需要显示
rat
dog
matress
我已经用sed
命令编码来显示输出:(sed "s/$up//g"
将$up
包含mat
)。但是使用这个命令,我得到的输出为
rat
dog
ress
我该怎么做才能解决这个问题?
请帮忙。
该/g
标志尝试对每一行多次应用替换命令。前两行很好,因为这个词只出现一次,但对于第三行,它将删除两者。
您可以使用零宽度断言更具体地解决它,例如^
或 GNU 扩展\b
,例如:
sed "s/^$up//g"
或者
sed "s/$up\b//g"
虽然更容易删除标志,例如:
sed "s/$up//"
在所有三种情况下,结果都是相同的,至少对于这种简单的例子。
sed 's/^mat //' /path/to/file
应该做的伎俩。请注意,没有g
; 它是s/foo/bar
; 不是s/foo/bar/g
。此外,^
将替换固定在每行的开头。
如果您确实分配了一个变量,例如$up
,您可以使用sed "s/^$up//" /path/to/file
.
您当前的命令将删除$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/"
使用awk
awk '{print $NF}' inputFile
$ cat text
mat rat
mat dog
mat matress
$ awk '{print $NF}' text
rat
dog
matress