使用命令将字符串添加到文件中

Ell*_*LLC 3 command-line bash scripts

我需要补充:

user_xattr,acl,barrier=1
Run Code Online (Sandbox Code Playgroud)

到我的 /etc/fstab 文件。有没有办法通过 via shell 脚本来做到这一点?

我只想编辑“ /”挂载。

这是我手动编辑之前的内容:

UUID=eb287d10-60a8-4a9a-9148-5f907fc7a8be / ext4 errors=remount-ro 0 1
Run Code Online (Sandbox Code Playgroud)

这是我手动添加行后的样子:

UUID=eb287d10-60a8-4a9a-9148-5f907fc7a8be / ext4 user_xattr,acl,barrier=1,errors=remount-ro 0 1
Run Code Online (Sandbox Code Playgroud)

我知道该sed -i命令在这里不起作用,因为它只会添加行...

脚本也可以在多台计算机上运行,​​因此它必须能够“知道”UUID 会有所不同。

ter*_*don 12

实际上,sed可以很好地工作,但这里还有更多选择:

1. sed

sudo sed -i.old -r '/[ \t]\/[ \t]/{s/(ext4[\t ]*)([^\t ]*)/\1\2,user_xattr,acl,barrier=1/}' /etc/fstab
Run Code Online (Sandbox Code Playgroud)

解释:

  • -i.old:就地编辑文件并fstab.old在更改前创建原始文件的备份。
  • -r : 启用扩展正则表达式。
  • /[ \t]\/[ \t]/{}: 如果该行匹配一个/由空格或制表符包围的 a(如果该行描述了/挂载点)。
  • s/(ext4[\t ]*)([^\t ]*)/\1\2,user_xattr,acl,barrier=1/:s/pat/replacement/是替换运算符,它将替换patreplacement. 在这里,我们正在匹配ext4任何后面的空格或制表符(需要锚定匹配,如果您的文件系统不是 ext4,您需要更改它)然后捕获(这就是括号所做的)最长的一段非-之后的空白字符。换句话说,捕获 fstab 的选项字段。然后我们将它们替换为\1(第一个捕获的模式),\2(第三个捕获模式,原始选项)加上您想要添加的额外选项。

2. Perl

sudo perl -i.old -pane 's/$F[3]/$F[3],user_xattr,acl,barrier=1/ if $F[1] eq "/"' /etc/fstab
Run Code Online (Sandbox Code Playgroud)

解释:

  • -i.old:同样,这将导致文件被就地编辑并fstab.old创建一个名为的备份。
  • -pane:-p表示打印每一行,-a自动将输入行拆分为空白区域,并将它们保存为数组@F-n意味着逐行读取并-e让您在命令行上传递脚本。
  • 实际的脚本将添加额外的选项到第4场的电流值($F[3],第1场$F[0]),仅在第二ffield($F[1]中,挂载点)/

3.awk

sudo cp /etc/fstab /etc/fstab.old && 
 awk '($2=="/"){$4=$4",user_xattr,acl,barrier=1"}1;' /etc/fstab.old | sudo tee /etc/fstab
Run Code Online (Sandbox Code Playgroud)

解释:

大多数版本awk不允许就地编辑,因此第一个命令将创建一个备份副本。然后awk将检查第二个字段是否是/,如果是,则将所需的文本添加到第四个字段,即选项。该1;是AWK简写“打印行”。这sudo tee只是一个允许打印的技巧,/etc/fstab因为简单的重定向不适用于sudo.

4.纯bash

sudo cp /etc/fstab /etc.fstab.old
while read fs mp ty op du pa; do 
    [[ $mp = "/" ]] && op="user_xattr,acl,barrier=1,""$op"; 
    printf "%s %s %s %s %s %s\n" "$fs" "$mp" "$ty" "$op" "$du" "$pa"; 
done < /etc/fstab.old | sudo tee /etc/fstab
Run Code Online (Sandbox Code Playgroud)

解释

  • while read fs mp ty op du pa; do ...; done < /etc/fstab : 读取每个 fstab 行并拆分为相关字段。
  • [[ $mp = "/" ]] && op="user_xattr,acl,barrier=1,""$op";如果挂载点是/,则将额外选项添加到$op.
  • printf刚刚正确打印的每一行。