“/fi/a”在此 sed 命令/脚本中起什么作用?

“/fi/a”在此 sed 命令/脚本中起什么作用?

/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

相关内容