删除单词中的最后一个字符,但仅当该字符存在时 - 在 bash 中

删除单词中的最后一个字符,但仅当该字符存在时 - 在 bash 中

仅当最后一个字符存在时,如何删除它?

输入:

OpenOffice.org/m
openOffice.org/ozm
个人。
Pfg。
菲尔。
教授。
分别。
屋顶长度/米
罗恩海峡

期望的输出:

OpenOffice.org
openOffice.org
珀斯
普夫格
菲尔
教授
响应
罗恩斯特尔
罗恩斯特

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

答案1

你只需要逃避你的命令中的点sed,一切都会好起来的。像这样:

sed 's/\.$//'

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

您也可以将所有sed++放入一个中:grepcutsed

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

答案2

删除一个字符仅当它存在时正是参数扩展的描述。

 $ 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

答案3

只需稍微更改您的正则表达式:即可转义. 并且您不需要grep

cat filename | cut -d"/" -f1 | sed 's/\.$//'

相关内容