【问题标题】:using sed to edit /etc/fstab使用 sed 编辑 /etc/fstab
【发布时间】:2018-02-23 23:30:52
【问题描述】:

/etc/fstab 我要编辑的行:

/dev/appvg/home         /home     ext3    defaults        0 0

如何让 sed 在默认列后面插入“,nodev”?

我在另一篇文章中发现了这个命令,它在“默认值”之前插入它,但我不知道如何在之后插入:

sed -ie 's:\(.*\)\(\s/home\s\s*\)\(\w*\s*\)\(\w*\s*\)\(.*\):\1\2\3nodev,\4\5:' /etc/fstab

这给了我这个:

/dev/appvg/home         /home     ext3    nodev,defaults  0 0

这就是我想要的样子:

/dev/appvg/home         /home     ext3    defaults,nodev  0 0

有可能吗?我是 sed 的新手...

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    假设这正是您想要更改的,对您的问题的最简单答案是:

    sed -ie '/^\/dev\/appvg\/home/ s/defaults/defaults,nodev/' /etc/fstab
    

    这就是说以 (^) 开头的行与 ^/dev/appvg/home 匹配,然后对其应用以下命令。在这种情况下,下面的命令是“change defaults to defaults,nodev”

    如果您想修改您提议进行更改的命令,那么您需要:

    sed -ie 's:\(.*\)\s\(/home\)\s\s*\(\w*\)\s*\(\w*\)\s*\(.*\):\1 \2 \3 \4,nodev \5:' /etc/fstab
    

    最后两个 ':' 字符之间的 \1、\2 等是替换标记,它们表示从表达式的第一部分替换匹配括号的内容。通过更改 \s 在匹配表达式中的位置,您只会得到单词 (\w) 字符,而不是替换中的空格 (\s) 字符。因此,您需要在结果字符串中插入自己的空格。

    【讨论】:

    • @BrianKuepper 很高兴它有帮助。不幸的是,你会发现很难不把列弄乱。如果保持列对齐至关重要,那么您将需要一个复杂得多的程序,该程序需要跟踪所有行的长度,并将结果打印到正确的长度。为此,您可能想看看使用 awk,而不是 sed。
    • @BrianKuepper 顺便说一句,如果此答案确实解决了您的问题,请不要忘记“接受”答案。
    • 您的第一个解决方案完美运行...谢谢!现在在另一个系统上,我遇到了同样的问题,但是该命令弄乱了选项卡列。这是我使用的命令: sed -e '/^\/dev\/mapper\/system-home/ s/defaults/defaults,nodev/' /etc/fstab 这是输出: /dev/mapper/system- home /home ext4 defaults,nodev 1 2 /dev/mapper/system-swap swap swap defaults 0 0(不知道会不会出现在fourm中) 有什么办法可以替换defaults之后的空白,nodev用一个制表符代替多个空格?
    • 我想通了: sed -e '/^\/dev\/mapper\/system-home/ s/defaults\s*1/defaults,nodev\t1/' /etc/fstab
    【解决方案2】:

    您也可以使用awk。通常在 Linux 中,defaults 位于/etc/fstab 文件的第 4 列。仅当行中包含 default 时,您才可以使用它来打印。

    awk '/defaults/{$4="defaults,nodev"}{print}' /etc/fstab
    

    具体到您的情况,

    awk '/\/dev\/appvg\/home/{$4="defaults,nodev"}{print}' /etc/fstab
    

    【讨论】:

    • cat 是多余的,awk 将文件名作为其输入。此外,这不会写入/etc/fstab
    【解决方案3】:

    你也可以试试这个方法:

    sed "s*/opt/apps/app1               ext4    defaults        1 1*/opt            ext4    defaults        1 2*g" -i /etc/fstab
    
    • 从第一个* 到第二个*:要搜索的字符串
    • 从第二个* 到第三个*:要替换的字符串。

    您可以先尝试不使用 -i 选项,该选项会在终端上输出更改,但实际上不会在实际文件中更改。

    【讨论】:

      猜你喜欢
      • 2011-05-21
      • 2021-09-21
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 2019-06-20
      相关资源
      最近更新 更多