用sed删除(或替换)带有斜杠的单词
我制作了一个脚本,在某个时候使用du来显示目录中使用的空间。我希望在字符串中不显示“/home/azarih”。我试着用一个例子来消除这个问题 我所拥有的:用sed删除(或替换)带有斜杠的单词,sed,Sed,我制作了一个脚本,在某个时候使用du来显示目录中使用的空间。我希望在字符串中不显示“/home/azarih”。我试着用一个例子来消除这个问题 我所拥有的: 5G /home/azarilh/folder/asd 我想要的是: 5G /folder/asd 我尝试过(以echo代替du为例): 也许可以修改它使其在这种情况下工作?请尝试以下内容 cho "5G /home/azarilh/folder/asd" | sed 's/\([^ ]* \)\/[^/]*\/[^/]*\(.*\)/
5G /home/azarilh/folder/asd
我想要的是:
5G /folder/asd
我尝试过(以echo代替du为例):
也许可以修改它使其在这种情况下工作?请尝试以下内容
cho "5G /home/azarilh/folder/asd" | sed 's/\([^ ]* \)\/[^/]*\/[^/]*\(.*\)/\1\2/'
详细说明:在这里使用sed
的组引用功能,它允许我们将匹配的正则表达式保存到缓冲内存中,并标识1
、2
等。因此,当在\(..)
和第行中找到的匹配项之间提到正则表达式时,它将以数字为参考保存到内存中(这取决于它的匹配编号,例如-->第一个匹配的正则表达式参考编号将是\1
)
第二种解决方案:如果您对
awk
解决方案满意,那么它将非常简单(考虑到您必须始终以相同的方式打印输出)
这应该做到:
echo "5G /home/azarilh/folder/asd" | sed -e 's+/home/azarilh+~+g'
# output: 5G ~/folder/asd
当您使用sed
时,您可以指定要更改的模式,例如s/from/to/g
(将“from”更改为“to”),但是/
分隔符几乎可以是任何东西。因此,如果要修改的字符串中有/
斜杠,则可以使用/
以外的内容,例如上面提到的+
您还可以在任何输出sed-e“s++${HOME}++
上使用${HOME}
替换${HOME}
目录
但是我想我还应该提到,通过在${HOME}
目录中运行du-hs./*
可以获得与所需类似的输出。这应该可以
拆下/home/azarilh部件,并将其更换为~
我想这就是你想要的,对吧
$ echo "5G /home/azarilh/folder/asd" | sed -e 's/\/home\/azarilh/~/g'
5G ~/folder/asd
\这三个答案都有效,但使用另一个字符代替斜杠确实很有用,也很容易理解,因此,这是最好的答案。谢谢。您的du解决方案tho在目录开头留下一个点,肯定比完整路径更好,但用我想要的任何内容替换它会更好。
echo "5G /home/azarilh/folder/asd" | awk -F'[ /]' '{print $1 OFS "/"$(NF-1)"/"$NF}'
echo "5G /home/azarilh/folder/asd" | sed -e 's+/home/azarilh+~+g'
# output: 5G ~/folder/asd
$ echo "5G /home/azarilh/folder/asd" | sed -e 's/\/home\/azarilh/~/g'
5G ~/folder/asd