如何用字符串“替换空格”\|&引用;使用sed?
我正试图建立一个排除列表,通过shell变量传递给“grep-v”,该列表由带有初始“/”的挂载点组成,所有挂载点都被删除,并用空格分隔。我是这样建造的:如何用字符串“替换空格”\|&引用;使用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'
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="\\|"
}