注释掉现有的行并创建同一行的新条目

时间:2018-03-08 23:12:26

标签: bash unix text-processing

我在sudoers文件中有以下行,

pankaj.a.batra      ALL=(ALL) NOPASSWD:ALL

我需要一个可以注释掉这个字符串的代码,并使用我要添加的后缀创建一个新的重复条目,就像这样的行之后

#pankaj.a.batra      ALL=(ALL) NOPASSWD:ALL
pankaj.a.batra      ALL=(ALL) NOPASSWD:ALL su - wheel

2 个答案:

答案 0 :(得分:0)

您可以选择sed解决方案:

$ cat input_file.in 
a
b
c
d
ankaj.a.batra      ALL=(ALL) NOPASSWD:ALL
e
f
g

$ SUFF=" su - wheel"; sed -i.bak "/^ankaj.a.batra      ALL=(ALL) NOPASSWD:ALL$/s/^\(.*\)$/#\1\n\1$SUFF/" input_file.in                            

$ cat input_file.in
a
b
c
d
#ankaj.a.batra      ALL=(ALL) NOPASSWD:ALL
ankaj.a.batra      ALL=(ALL) NOPASSWD:ALL su - wheel
e
f
g

<强>说明:

  • -i.bak将以内联模式激活sed(输入文件的修改)+输入文件的备份以防万一。
  • /^ankaj.a.batra ALL=(ALL) NOPASSWD:ALL$/将仅过滤包含ankaj.a.batra ALL=(ALL) NOPASSWD:ALL
  • 的行
  • 在这些行上,您s/^\(.*\)$/#\1\n\1$SUFF/执行#行的开头,并使用反向引用(.*\)复制行内容,创建新行,复制此内容并添加后缀。

答案 1 :(得分:0)

如果awk是一个选项,请试一试:

awk '{print "#" $0 "\n" $0}' /path/to/file

"#" $0将评论现有行

"\n" $0会输入相同的

如果您想添加额外的文字:

awk '{print "#" $0 "\n" $0 " su - wheel"}' foo

请记住,如果文件有多行,则所有&#34;新行&#34;将包含su - wheel,因此这仅适用于具有单行的文件的情况:/etc/sudoers.d/pankaj.a.batra 含有:

pankaj.a.batra      ALL=(ALL) NOPASSWD:ALL

如果你跑:

awk '{print "#" $0 "\n" $0 " su - wheel"}' /etc/sudoers.d/pankaj.a.batra

将打印到stdout

# pankaj.a.batra      ALL=(ALL) NOPASSWD:ALL
pankaj.a.batra      ALL=(ALL) NOPASSWD:ALL su - wheel

稍后如果您对输出感到满意,可以通过执行以下操作覆盖原始文件:

awk '{print "#" $0 "\n" $0 " su - wheel"}' \
    /etc/sudoers.d/pankaj.a.batra > file.tmp && mv file.tmp /etc/sudoers.d/pankaj.a.batra

如果文件有多行你可以试试这个,这肯定可以作为练习改进,但希望可以给你一个想法:

 awk '
    {
        if ( $1 ~ /^pankaj.a.batra/ ) 
          { print "#" $0 "\n" $0 " su - wheel" }
        else 
          { print $0}
    }
' /etc/sudoers

这将检查以pankaj.a.batra开头的行,将对原始行进行注释并创建包含所需文本的新条目,在这种情况下su - wheel另一种方法是实现相同的避免if /否则:

awk '/^pankaj.a.batra/{$0 = "#"$0"\n"$0 "su - wheel"} 1'

这里1和结尾意味着打印每一行,在awk中,$0是整个参数行,而$1只是分隔参数列表中的第一个参数按空格。