αғs*_*нιη 5 sed text-processing
我试图在第一个char1和char2之间使用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} )保存在变量中。
这是 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
这会从模式空间中删除除第一个X和Y包括任何空格之间的文本之外的所有内容。然后将其打印到标准输出。这是 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被引用时,在双引号内这样做,如上例所示。