1

我的部分文件如下所示:

${goto 97}${exec sed -n '1p' $HOME/.config/conky/itl/raw2}#
${goto 194}${exec sed -n '2p' $HOME/.config/conky/itl/raw2}#
${goto 291}${exec sed -n '3p' $HOME/.config/conky/itl/raw2}#
${goto 388}${exec sed -n '4p' $HOME/.config/conky/itl/raw2}#
${goto 485}${exec sed -n '5p' $HOME/.config/conky/itl/raw2}#
${goto 582}${exec sed -n '6p' $HOME/.config/conky/itl/raw2}#
${goto 679}${exec sed -n '7p' $HOME/.config/conky/itl/raw2}#
${goto 776}${exec sed -n '8p' $HOME/.config/conky/itl/raw2}#
${goto 873}${exec sed -n '9p' $HOME/.config/conky/itl/raw2}#

我想将“$ {goto nn}”向上移动1行,丢弃第一个(或者,可选地将第一个移动到最后一个位置)

编辑: goto 后的数值在整个文件中以这种方式重复多次。我想以所描述的方式全部更改它们。此外,配置文件包含之前和之后的其他内容。

因为我刚刚熟悉 sed,所以我想用 sed 解决它,但只要它可以进入 linux shell 脚本,它就不是必须的。

edit2:我希望配置文件也包含 sed 命令不会让人感到困惑。这与我正在寻找的解决方案无关。

4

1 回答 1

1

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

sed '$!N;s/^\(${goto [0-9]\+}\)\(.*\n\)\(${goto [0-9]\+}\)/\3\2\1/;P;D' file
  • $!N对于除最后一行之外的所有内容,将换行符和下一行添加到模式空间
  • s/^\(${goto [0-9]\+}\)\(.*\n\)\(${goto [0-9]\+}\)/\3\2\1/${goto [0-9]\+}对于以where表示一个或多个数字的表达式开头的两个连续行[0-9]\+,记下这些字符串和中间字符串并将它们交换。
  • P;D打印到第一个换行符\n,然后删除到并包括换行符。如果模式空间不为空,则不会自动读取下一行,而是从第一个命令开始一个新的循环(然后附加一个换行符......)。
于 2012-11-24T11:26:33.793 回答