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

iyr*_*rin 1 sed regular-expression

/fi/a下面做 什么?

sudo sed -i.bak '/fi/a #xrdp multiple users configuration \n xfce-session \n' /etc/xrdp/startwm.sh
Run Code Online (Sandbox Code Playgroud)

看起来它找到任何包含“fi”的行,然后将该字符串写入下一行。不幸的是,虽然它们似乎只针对“fi”,但它也适用于该文件中包含单词“profile”的行。

此处和其他几个地方推荐使用该命令:
https://medium.com/@vivekteega/how-to-setup-an-xrdp-server-on-ubuntu-18-04-89f7e205bd4e

ter*_*don 5

该命令完全按照您所说的进行。它将将该字符串附加到一行中第一次出现的每个位置。fi但由于它只是寻找fi,它还将匹配“profile 或“ finite ”或“ verifiable ”或任何其他包含 的字符串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 
Run Code Online (Sandbox Code Playgroud)

fi如您所见,仅更改了独立版本。所以你可以将原来的命令更改为:

sudo sed -i.bak '/\bfi\b/a #xrdp multiple users configuration \n xfce-session \n' /etc/xrdp/startwm.sh
Run Code Online (Sandbox Code Playgroud)

如果你的sed风味不知道\b但支持-E,你也可以这样做:

sed -E '/(^| )fi( |$)/a #xrdp multiple users configuration \n xfce-session \n' file 
Run Code Online (Sandbox Code Playgroud)

然而,据我所知,大多数 sed 实现无法处理\n,所以这几乎肯定需要 GNU sed 。