sed不会从文件中删除多行字符串的实例

时间:2018-06-16 23:59:52

标签: bash sed

我正在尝试删除占用多行的字符串的所有实例。这是我试图操纵的文件的摘录:

xdotool mousemove_relative --sync --polar 90 32
xdotool mousemove_relative --sync --polar 270 32; xdotool mousemove_relative --sync --polar 180 2
xdotool mousemove_relative --sync --polar 90 32
xdotool mousemove_relative --sync --polar 270 32; xdotool mousemove_relative --sync --polar 180 2

最终结果应如下所示:

mousemove_relative --sync --polar 180 2
mousemove_relative --sync --polar 180 2

以下是我为此做的代码:

width=16
sed -i -e 's/xdotool mousemove_relative --sync --polar 90 '$(($width * 2))''\n'xdotool mousemove_relative --sync --polar 270 '$(($width * 2))'; //g' file.sh

但是,运行此代码不会对目标文件执行任何操作。我检查了语法并做了一些搜索,我可以想到为什么这不起作用的任何原因。也许我没有使用正确的工具来完成工作。任何有关为什么不起作用的见解将不胜感激。

2 个答案:

答案 0 :(得分:1)

默认情况下,

sed一次在一行上工作。尝试使用N命令一次读取两行:

sed -e '{
    N
    s/xdotool mousemove_relative --sync --polar 90 32\nxdotool mousemove_relative --sync --polar 270 32; //g
    P
    D
}' file.sh

以下是一个更简单的示例文件(test.file)的工作原理:

Line A
Line B
Line C
Line D

要替换您运行的Line BLine C

sed -e '{
    N
    s/Line B\nLine C/New Line B and C/g
    P
    D
}' test.file

sed将:

  • 阅读Line A
  • N命令读取下一行,因此缓冲区为Line A\nLine B
  • s/../../g查找和替换将应用于缓冲区。
  • P命令打印缓冲区的第一行。
  • D命令弹出缓冲区的第一行。
  • 下一个N命令追加另一行。

答案 1 :(得分:1)

sed -n 's/.* xdotool //p' file.sh

输出:

mousemove_relative --sync --polar 180 2
mousemove_relative --sync --polar 180 2