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

时间:2019-01-13 14:13:31

标签: sed

我试图建立一个排除列表,以通过外壳变量传递给“ 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'

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 /'”的输出为:

devtmpfs on /dev type devtmpfs (rw,nosuid,relatime,sync,size=1024k,nr_inodes=502793,mode=755)
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 /'| awk {print $ 3}”的输出为:

/dev
/proc
/sys
/tmp
/var/run

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

dev proc sys tmp var/run

如前所述。

2 个答案:

答案 0 :(得分:2)

您可以使用单个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的输出记录定界符静音。

答案 1 :(得分:0)

尝试附加此内容:

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\|...

顺便说一句,您正在使用什么系统? -似乎将mount的输出\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都将留下尾随\|