修改文件匹配WORD1和NOT WORD2(Sed / Awk)中的行

时间:2013-01-03 02:14:49

标签: regex sed awk

我需要将内核参数添加到尚未包含它们的行中。 (如果已经存在,请不要将其添加到所有行。)

我已经构建了这个awk命令来在缓冲区中执行它,但由于awk缺乏像sed这样的编辑能力,因此无法将其放入文件本身。 (但我无法弄清楚如何与sed进行此类匹配。)

awk '/\tkernel/&&!/audit=1/ { print $0" audit=1"; }' /etc/grub.conf

这会查找匹配“kernel”和 NOT “audit = 1”的行(必要时附加“audit = 1”。)

标记为sed / awk,但对其他建议持开放态度。

2 个答案:

答案 0 :(得分:3)

使用sed:

sed -i '/kernel/{/audit=1/!s/$/ audit=1/}' /etc/grub.conf

答案 1 :(得分:3)

sed的就地编辑功能使用没有后缀的临时文件来替换现有文件。例如,这个:

sed -i '/\tkernel/ { /audit=1/!s/$/ audit=1/ }' /etc/grub.conf

与此相同:

sed '/\tkernel/ { /audit=1/!s/$/ audit=1/ }' /etc/grub.conf > tmp && mv tmp /etc/grub.conf

-i标志只是糖涂层过程。因此,您只需将相同的逻辑应用于awk命令:

awk '/\tkernel/ && !/audit=1/ { print $0, "audit=1"; next }1' /etc/grub.conf > tmp && mv tmp /etc/grub.conf