使用sed或awk,将行匹配模式移动到文件底部

时间:2019-05-13 13:13:40

标签: awk sed

我有类似的问题。我需要将/ etc / sudoers中的一行移到文件末尾。

我要移动的行:

#includedir /etc/sudoers.d

我尝试了一个变量

#creates variable value
templine=$(cat /etc/sudoers | grep "#includedir /etc/sudoers.d")

#delete value
sed '/"${templine}"/d' /etc/sudoers

#write value to the bottom of the file
cat ${templine} >> /etc/sudoers

没有任何错误,也没有得到我想要的结果。

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

使用awk:

awk '$0=="#includedir /etc/sudoers.d"{lastline=$0;next}{print $0}END{print lastline}' /etc/sudoers

说:

  1. 如果行$0"#includedir /etc/sudoers.d",则将变量lastline设置为该行的值$0,然后跳到下一行next
  2. 如果您仍然在此处,请打印行{print $0}
  3. 处理完文件中的每一行后,请打印lastline变量中的所有内容。

示例:

$ cat test.txt
hi
this
is
#includedir /etc/sudoers.d
a
test
$ awk '$0=="#includedir /etc/sudoers.d"{lastline=$0;next}{print $0}END{print lastline}' test.txt
hi
this
is
a
test
#includedir /etc/sudoers.d

答案 1 :(得分:1)

您可以使用sed完成整个操作:

sed -e '/#includedir .etc.sudoers.d/ { h; $p; d; }' -e '$G' /etc/sudoers

答案 2 :(得分:1)

这可能对您有用(GNU sed):

sed -n '/regexp/H;//!p;$x;$s/.//p' file

这将删除包含指定正则表达式的行,并将其附加到文件末尾。

要仅移动与正则表达式匹配的第一行,请使用:

sed -n '/regexp/{h;$p;$b;:a;n;p;$!ba;x};p' file

这使用循环读取/打印文件的其余部分,然后附加匹配的行。

答案 3 :(得分:0)

如果有多个条目要移至文件末尾,则可以执行以下操作:

awk '/regex/{a[++c]=$0;next}1;END{for(i=1;i<=c;++i) print a[i]}' file

sed -n '/regex/!{p;ba};H;:a;${x;s/.//;p}' file