为什么sed要复制添加的第一行(将sed输出发送到同一个文件)



启动文件(/etc/crontabs/root(:

# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*/15    *       *       *       *       run-parts /etc/periodic/15min  
0       *       *       *       *       run-parts /etc/periodic/hourly 
0       2       *       *       *       run-parts /etc/periodic/daily  
0       3       *       *       6       run-parts /etc/periodic/weekly 
0       5       1       *       *       run-parts /etc/periodic/monthly

我想复制此文件,删除注释。。。并将内容添加到同一个文件中,所以我运行:

sed '/^#/ d; s//etc//root/etc/' /etc/crontabs/root >> /etc/crontabs/root

应该删除所有注释,将/etc替换为/etc/root。。。并将结果添加到同一文件中。

错误输出(请注意以*/15开头的"额外"行(:

# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*/15    *       *       *       *       run-parts /etc/periodic/15min
0       *       *       *       *       run-parts /etc/periodic/hourly
0       2       *       *       *       run-parts /etc/periodic/daily
0       3       *       *       6       run-parts /etc/periodic/weekly
0       5       1       *       *       run-parts /etc/periodic/monthly        
*/15    *       *       *       *       run-parts /root/etc/periodic/15min     
0       *       *       *       *       run-parts /root/etc/periodic/hourly    
0       2       *       *       *       run-parts /root/etc/periodic/daily     
0       3       *       *       6       run-parts /root/etc/periodic/weekly    
0       5       1       *       *       run-parts /root/etc/periodic/monthly   
*/15    *       *       *       *       run-parts /root/root/etc/periodic/15min

预期/想要的输出

# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*/15    *       *       *       *       run-parts /etc/periodic/15min
0       *       *       *       *       run-parts /etc/periodic/hourly
0       2       *       *       *       run-parts /etc/periodic/daily
0       3       *       *       6       run-parts /etc/periodic/weekly
0       5       1       *       *       run-parts /etc/periodic/monthly        
*/15    *       *       *       *       run-parts /root/etc/periodic/15min     
0       *       *       *       *       run-parts /root/etc/periodic/hourly    
0       2       *       *       *       run-parts /root/etc/periodic/daily     
0       3       *       *       6       run-parts /root/etc/periodic/weekly    
0       5       1       *       *       run-parts /root/etc/periodic/monthly   

想法?

您不应该向正在读取的同一个文件进行写入。它将读取您添加到文件中的行,并继续处理它们。因此,当它到达具有/root/etc的行时,它将替换其中的/etc,从而产生/root/root/etc。它可能会陷入无限循环,因为它一直在扩展文件,永远不会到达最后。

您可以做的是将crontab文件复制到一个新文件中,然后使用sed附加到该文件中。

cp /etc/crontabs/root /tmp/new_crontab
sed '/^#/ d; s//etc//root/etc/' /etc/crontabs/root >> /tmp/new_crontab
cp /tmp/new_crontab /etc/crontabs/root

如果您想要一个一行,可以直接使用ed:

printf "%sn" ka '1,$t' "'a,$g/^#/d" "'a+1,$s//etc//root/etc/" w | ed -s /etc/crontabs/root

或者使用heredoc更容易阅读:

ed -s /etc/crontabs/root <<'EOF'
ka
1,$t
'a,$g/^#/d
'a+1,$s//etc//root/etc/
w
EOF

相关内容

  • 没有找到相关文章

最新更新