如何使用'sed'命令将匹配的模式保存到变量中?

αғs*_*нιη 5 sed text-processing

我试图在第一个char1char2之间使用sed命令找到一个模式 ,然后用字符串替换它。像下面的模式示例:file.txtecho

echo "This X is test Y. But X is not test Y." | sed 's/X[^Y]*Y/REPLACE/'
Run Code Online (Sandbox Code Playgroud)

此外,我需要将匹配的模式(例如is test{<--spaces around is important} )保存在变量中。

Joh*_*024 9

这是 sed 的单个调用,它将修改后的行写入 stdout,同时将删除的文本保存在 shell 变量中var

$ var=$(echo "This X is test Y. But X is not test Y." | sed -nr 'h;s/[^X]*X([^Y]*)Y.*/\1/;p;x;s/X[^Y]*Y/REPLACE/;w /dev/stderr') 2>&1
This REPLACE. But X is not test Y.
Run Code Online (Sandbox Code Playgroud)

的价值var是:

$ echo "==$var=="
== is test ==
Run Code Online (Sandbox Code Playgroud)

解释:

  • h

    此命令将当前模式复制到保持空间。

  • s/[^X]*X([^Y]*)Y.*/\1/;p

    这会从模式空间中删除除第一个XY包括任何空格之间的文本之外的所有内容。然后将其打印到标准输出。这是 shell 捕获并分配给var.

  • x

    这将保留空间复制回模式空间。完成后,模式空间包含原始输入行的副本。

  • s/X[^Y]*Y/REPLACE/; w /dev/stderr

    进行替换并将结果写入stderr

  • 2>&1

    在 shell 将 stdout 捕获到 中后var,这会指示 shell 将 stderr(带有 REPLACE 的行)复制到 stdout。

除了处理变量 var

该变量var包括前导和尾随空格。如果外壳随后var要进行分词,则这些空格将被删除。为了防止这种情况,当var被引用时,在双引号内这样做,如上例所示。