我有类似的问题。我需要将/ 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
没有任何错误,也没有得到我想要的结果。
有什么建议吗?
答案 0 :(得分:2)
使用awk:
awk '$0=="#includedir /etc/sudoers.d"{lastline=$0;next}{print $0}END{print lastline}' /etc/sudoers
说:
$0
是"#includedir /etc/sudoers.d"
,则将变量lastline
设置为该行的值$0
,然后跳到下一行next
。 {print $0}
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