Perlreplace从脚本中产生空文件,而不是从bash中产生

目前我对这个问题感到非常沮丧。 我看不出我做错了什么。 我有这个谷歌浏览器的问题,它提供了一个没有正常closures的通知。 我想摆脱这一点。 另外我有一些更旧的replace,必须与全屏幕大小。 在bash中,所有的行产生预期的结果; 然而,在一个脚本文件,它产生一个空的设置文件…

这些行在文件中:

cat ~/.config/google-chrome/Default/Preferences | perl -pe "s/\"work_area_bottom.*/\"work_area_bottom\": $(xrandr | grep \* | cut -d' ' -f4 | cut -d'x' -f2),/" > ~/.config/google-chrome/Default/Preferences cat ~/.config/google-chrome/Default/Preferences | perl -pe "s/\"bottom.*/\"bottom\": $(xrandr | grep \* | cut -d' ' -f4 | cut -d'x' -f2),/" > ~/.config/google-chrome/Default/Preferences cat ~/.config/google-chrome/Default/Preferences | perl -pe "s/\"work_area_right.*/\"work_area_right\": $(xrandr | grep \* | cut -d' ' -f4 | cut -d'x' -f1),/" > ~/.config/google-chrome/Default/Preferences cat ~/.config/google-chrome/Default/Preferences | perl -pe "s/\"right.*/\"right\": $(xrandr | grep \* | cut -d' ' -f4 | cut -d'x' -f1),/" > ~/.config/google-chrome/Default/Preferences cat ~/.config/google-chrome/Default/Preferences | perl -pe "s/\"exit_type.*/\"exit_type\": \"Normal\",/" > ~/.config/google-chrome/Default/Preferences cat ~/.config/google-chrome/Default/Preferences | perl -pe "s/\"exited_cleanly.*/\"exited_cleanly\": true,/" > ~/.config/google-chrome/Default/Preferences 

我一直在为这个问题googling很多; 然而,我没有得到正确的search词来获得有用的结果。

问题通过使用perl -p -i -e选项来解决,如下所示:

 perl -p -i -e "s/\"exit_type.*/\"exit_type\": \"Normal\",/" ~/.config/google_chrome/Default/Preferences 

上面的代码足以摆脱不正确关机的Google Chrome邮件

你的问题几乎可以肯定:

  > ~/.config/google-chrome/Default/Preferences 

因为>说'截断文件'。 更糟糕的是,它在开始阅读之前先做了这个。 因此,在读取文件之前截断文件,导致长度为零的文件进入零长度文件。

我建议你想在perl中完全做到这一点,而不是一个中途的房子。 perl支持“就地编辑”的-i选项。

或者只需在perl写脚本即可。 (如果给出样本输入和输出,敲出一个可以做你想做的事情的例子将会非常简单)。

如果您需要搜索并替换一些文本,我建议使用:

 ack -l --print0 '2011...' ~/.config/google-chrome/Default/Preferences | xargs -0 -n 1 sed -i -e 's/2011../2015.../g'