我在sudoers文件中有以下行,
pankaj.a.batra ALL=(ALL) NOPASSWD:ALL
我需要一个可以注释掉这个字符串的代码,并使用我要添加的后缀创建一个新的重复条目,就像这样的行之后
#pankaj.a.batra ALL=(ALL) NOPASSWD:ALL
pankaj.a.batra ALL=(ALL) NOPASSWD:ALL su - wheel
答案 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
只是分隔参数列表中的第一个参数按空格。