![“/fi/a”在此 sed 命令/脚本中起什么作用?](https://linux22.com/image/165237/%E2%80%9C%2Ffi%2Fa%E2%80%9D%E5%9C%A8%E6%AD%A4%20sed%20%E5%91%BD%E4%BB%A4%2F%E8%84%9A%E6%9C%AC%E4%B8%AD%E8%B5%B7%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
/fi/a
下面做 什么?
sudo sed -i.bak '/fi/a #xrdp multiple users configuration \n xfce-session \n' /etc/xrdp/startwm.sh
看起来它找到任何包含“fi”的行,然后将该字符串写入下一行。不幸的是,虽然它们似乎只针对“fi”,但它也适用于该文件中包含单词“profile”的行。
此处和其他几个地方推荐使用该命令:
https://medium.com/@vivekteega/how-to-setup-an-xrdp-server-on-ubuntu-18-04-89f7e205bd4e
答案1
该命令完全按照您所说的进行。它将把字符串附加到每个第一的出现fi
在一行中。但由于它只是寻找fi
,它也会匹配“pro菲勒”或“菲晚上”或“维里菲能够”或任何其他包含fi
.
为了避免这种情况,您可以指定它只在单词边界处匹配 ( \b
)。对于 GNU sed
(也可能是其他的,\b
相对可移植):
$ cat file
profile
finite
verifiable
foo bar fi
$ $ sed '/\bfi\b/a #xrdp multiple users configuration \n xfce-session \n' file
profile
finite
verifiable
foo bar fi
#xrdp multiple users configuration
xfce-session
fi
如您所见,仅更改了独立版本。所以你可以将原来的命令更改为:
sudo sed -i.bak '/\bfi\b/a #xrdp multiple users configuration \n xfce-session \n' /etc/xrdp/startwm.sh
如果你的sed
风味不知道\b
但支持-E
,你也可以这样做:
sed -E '/(^| )fi( |$)/a #xrdp multiple users configuration \n xfce-session \n' file
然而,据我所知,大多数 sed 实现无法处理\n
,所以这几乎肯定需要 GNU sed 。
答案2
如果你想fi
在单行上匹配 a,你可以用^
(行的开头) 和$
(行的结尾) 来锚定它。\n
您还可以删除字符串前后的一些不必要的空格字符。
sudo sed -i.bak '/^fi$/a #xrdp multiple users configuration\nxfce-session\n' /etc/xrdp/startwm.sh