删除单词中的最后一个字符,但前提是该字符存在-以bash开头


13

仅在有最后一个字符的情况下如何删除?

输入:

OpenOffice.org/m
openOffice.org/ozm
人
Pfg。
菲尔
教授
分别
根/米
盎司/盎司

所需的输出:

OpenOffice.org
openOffice.org
佩尔斯
聚乙二醇
菲尔
教授
回应
伦斯特
伦斯特

到目前为止,我只剩下了点,但不幸的是最后一个sed命令也删除了字母g$ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

Answers:


13

您只需要在sed命令中转义点,一切都会好起来的。像这样:

sed 's/\.$//'

因为在不逃脱的情况下,.$它将匹配字符串末尾的任何字符。

您也可以将所有sed+ grep+ cut放到一个中sed

sed 's=/[^/]*$==;s/\.$//' filename

太好了,谢谢!:)我使用的字典超过30万行,所以这就是为什么我使用grep“ \”的原因。只在那里得到带有点的单词。
removelastdotonlyifitsthere有

sed的也可以用这样的不便做到这一点: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}。无论如何grep+的sed工作时间会超过一个sed
2012年

如果可以用一个sed完成,那将是很好。如何应用上一个sed命令?
removelastdotonlyifitsthere

sed 's/[./]\+[^./]*$//'
Peter.O 2012年

现在,我不需要剪切,但是grep仍然存在。一个与我的管道grep命令等效的sed然后将grep删除,如果可能的话,那会很好。“还可以将所有sed + grep +切成一个sed”对我不起作用,打印所有单词吗?
removelastdotonlyifitsthere

1

仅在有字符扩展的情况下删除该字符,确切描述了参数扩展。

 $ var=path.
 $ echo "$var    ${var%.}"
 path.    path

在这种情况下,点不是特殊的(正则表达式中的点是特殊的)。

其他模式可以通过以下方式删除%/*

 $ var=openOffice.org/ozm
 $ echo "${var%/*}"
 openOffice.org

要同时删除两者:

 $ var=roonstr./ozm
 $ var=${var%/*}
 $ var=${var%.}
 $ echo "$var"
 roonstr

当然,要处理源文件,在文件上使用sed更快。
只记得加引号(从字面上匹配它,否则表示:任何字符)。

 $ sed 's,/.*,,;s,\.$,,' file

这应该是公认的答案。需要更多的投票。
David Parks

0

只需稍微改变你的正则表达式:逃脱. 而你并不需要grep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.