如何用字符串“替换空格”\|&引用;使用sed?

如何用字符串“替换空格”\|&引用;使用sed?,sed,Sed,我正试图建立一个排除列表,通过shell变量传递给“grep-v”,该列表由带有初始“/”的挂载点组成,所有挂载点都被删除,并用空格分隔。我是这样建造的: EXCLUDE_LIST=$(mount | grep -v '/dev/' | awk '{ print $3 }' | sed 's,^[^/]*/,,' ) 这将生成字符串“dev proc sys tmp var/run”。这是我想用“\\;”替换空格的字符串,以便“grep-v”可以使用它 我试着附加 sed 's/ /\|/g'

我正试图建立一个排除列表,通过shell变量传递给“grep-v”,该列表由带有初始“/”的挂载点组成,所有挂载点都被删除,并用空格分隔。我是这样建造的:

EXCLUDE_LIST=$(mount | grep -v '/dev/' | awk '{ print $3 }' | sed 's,^[^/]*/,,' )
这将生成字符串“dev proc sys tmp var/run”。这是我想用“\\;”替换空格的字符串,以便“grep-v”可以使用它

我试着附加

sed 's/ /\|/g'
到上一个管道,然后

sed 's/ /\\|/g'

我想要的是“dev\|proc\| sys\|tmp\|var/run”,但我总是得到“dev proc sys tmp var/run”

编辑

mount的输出是

/dev/sda1 on / type ext4 (rw,reltime,nobarrier,commit=10)
devtmpfs on /dev type devtmpfs (rw,nosuid,relatime,sync,size=1024k,nr_inodes=502793,mode=755)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /dev/shm type tmpfs (rw,relatime,sync,size=1024k)
procfs on /proc type procfs (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /tmp type tmpfs (rw,relatime,sync,size=524288k)
tmpfs on /var/run type tmpfs (rw,relatime,sync,size=131072k)
“mount | grep-v'/dev/”的输出是:

“mount | grep-v'/dev/'| awk{print$3}”的输出是:

最后,“mount | grep-v'/dev/'| awk{print$3}| sed's,^[^/]*/,”的输出是

如前所述。

尝试附加以下内容:

awk -v RS="" '{gsub(/[\r\n]+/,"\\|")}1'
即:

mount | grep -v '/dev/' | awk '{ print $3 }' | sed 's,^[^/]*/,,' | awk -v RS="" '{gsub(/[\r\n]+/,"\\|")}1'
#=> sys\|proc\|dev\|sys/kernel/security\|run\|sys/fs/cgroup\|sys/fs/cgroup/systemd\|...

顺便说一句,你在哪个系统?--似乎它将挂载的输出
\n
换行符视为空格。
--还是只是你的打字错误

由于通常情况下,您的一系列命令将产生:

sys
proc
dev
sys/kernel/security
run
...
但是你说这是一个空格分隔的字符串,所以我最好的猜测是你的系统/编辑器将
\n
显示为空格,这误导了你相信它们是空格。
如果我猜错了,请纠正我

犯了一个错误,刚刚修复。
我也不相信sed本身会把行尾改成空格

好吧,为了好玩,也尝试了
awk
方式:

mount | awk -v ORS="\\\|" '$0!~"/dev/"{print gensub("^/","",1,$3)}'
#=> sys\|proc\|dev\|sys/kernel/security\|run\|sys/fs/cgroup\|sys/fs/cgroup/systemd\|...
为了再次获得乐趣:

mount| awk '!(FNR%2) && !/dev\/|^$/' RS="on /| type " ORS="\\\|"

两个
awk
都将留下尾随
\\124;

您可以使用单个
awk
命令:

mount | awk '!/\/dev\//{sub("/",d,$3);print $3;d="\\|"}' ORS=''
使用
mount
的给定输入,它将打印

dev\|proc\|sys\|tmp\|var/run
说明:

# Applies to all lines with does not match /dev
!/\/dev/{
    # Remove leading / with delimiter d
    # d will be empty upon first use
    sub("/","",$3)
    # Print the column
    print $3
    # Set delimiter after first usage
    d="\\|"
}

ORS='
将使awk的输出记录定界符静音。

mount
的输出和您所需的输出添加到您的问题中。
echo'dev proc sys tmp var/run';sed's/\\\\\\\/g'
实际产生
dev proc sys tmp\124; var/run
,您的
sed
版本是什么?Cyrus,添加了管道各个阶段的输出。我不明白你的第二个要求,就在最后。是的,我刚刚试过echo“dev proc”| sed的//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。但如果我像我现在在脚本中所做的那样回显$EXCLUDE_列表,则什么也没有。它是GNU sed 4.5。“顺便说一句,您在哪个系统中?--似乎它将mount的输出\n换行符视为空格。”请重新阅读管道的最后一个元素;-)其GNU为4.5。对不起,我的错。你说得对。这很奇怪,实际上并不像你正确指出的那样。但当我从脚本运行它时,它会!嗯……啊,将输出分配给shell变量就是这样!因此,“echo$EXCLUDE_LIST”显示空格来代替“\n”不将许多
sed
grep
awk
命令链接在一起。使用
awk
effeciently@Tiw是的,是的,我知道。它非常方便,因为变量与另一个字符串连接;-)接近,但没有雪茄!其输出为proc\| sys\|tmp\| var/run。它正在吞噬我需要的初始“dev”。知道了。改变了这个命令非常有效,thanx!有一件事很棘手,那就是打印出一条警告:“awk:cmd.line:1:warning:escape sequence
\\\|'被当作普通的
\|'”。你知道怎么摆脱它吗?好的,我试着用
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
代替
\\\\\\\\\\\\\\\\\。警告消失了。谢谢。@t这取决于您在shell中使用的引号的类型:
ORS='\\\\\\\;'
ORS=“\\\\\\\”
。这是因为shell将扩展双引号字符串。
mount| awk '!(FNR%2) && !/dev\/|^$/' RS="on /| type " ORS="\\\|"
mount | awk '!/\/dev\//{sub("/",d,$3);print $3;d="\\|"}' ORS=''
dev\|proc\|sys\|tmp\|var/run
# Applies to all lines with does not match /dev
!/\/dev/{
    # Remove leading / with delimiter d
    # d will be empty upon first use
    sub("/","",$3)
    # Print the column
    print $3
    # Set delimiter after first usage
    d="\\|"
}