用sed删除(或替换)带有斜线的单词

时间:2019-11-28 05:46:06

标签: 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.*"

在这种情况下,也许可以对其进行修改以使其起作用?

3 个答案:

答案 0 :(得分:0)

请您尝试以下。

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

详细说明: 在此处使用sed的组引用功能,这使我们可以将标识为{{1}的匹配正则表达式保存到缓冲存储器中},1等。因此,当在2与在行中找到的匹配项之间提到正则表达式时,它将以数字的引用形式保存到内存中(这将取决于其匹配号,例如->第一个匹配的正则表达式引用号为\(....\)


第二个解决方案: :如果您同意使用\1解决方案,它将非常简单(考虑到您始终必须以相同的方式打印输出)。

awk

答案 1 :(得分:0)

这应该做到:

echo "5G /home/azarilh/folder/asd" | sed -e 's+/home/azarilh+~+g'
# output: 5G ~/folder/asd

使用sed时,您可以指定模式,更改的内容类似于s/from/to/g(将“从”更改为“至”),但是/分隔符几乎可以是任何东西。因此,如果您要修改的字符串中有/斜杠,则可以使用/以外的其他字符,例如上面的+

您还可以在任何输出sed -e "s+${HOME}+~+上将${HOME}目录替换为~

但是我想我也应该提到,通过在du -hs ./*目录中运行${HOME},可以获得与所需类似的输出。

答案 2 :(得分:0)

这应该有效。

删除/ home / azarilh部分,并将其替换为〜。

我想这就是你想要的,对吧?

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