首页 > 解决方案 > 用 sed 删除(或替换)带有斜线的单词

问题描述

我制作了一个在某些时候使用 du 的脚本,以显示目录中使用的空间。我希望在字符串中没有“/home/azarilh”的情况下显示它。我试图用一个例子来删除它......

是)我有的:

5G /home/azarilh/folder/asd

我想得到什么:

5G /folder/asd

我尝试过(以 echo 代替 du 为例):

echo "5G /home/azarilh/folder/asd" | sed -e 's/\<\/home\/azarilh\>//g'

获得“~/folder/asd”而不是仅仅删除“/home/azarilh”会更好。不需要sed,我试过grep但没有成功。我使用 grep 删除前缀并且它有效。

echo "$string" | grep -oP "^$prefix\K.*"

也许可以修改它以在这种情况下工作?

标签: sed

解决方案


请您尝试以下操作。

cho "5G /home/azarilh/folder/asd" | sed 's/\([^ ]* \)\/[^/]*\/[^/]*\(.*\)/\1\2/'

详细解释:这里使用sed's 组引用能力,它允许我们将匹配的正则表达式保存到带有 等标识的缓冲内存12。因此,当在中间提到一个正则表达式\(....\)并且在行中找到一个匹配项时,它将参考数字保存到内存中(这将取决于其匹配的编号,例如->第一个匹配的正则表达式参考编号将是\1)。


第二种解决方案:如果您对awk解决方案感到满意,那将非常简单(考虑到您总是必须以相同的方式打印输出)。

echo "5G /home/azarilh/folder/asd" | awk -F'[ /]' '{print $1 OFS "/"$(NF-1)"/"$NF}'

推荐阅读