如何使 sed 仅对一行的特定部分进行操作?而且,相反,我如何使 sed 不能在一行的特定部分工作?
例子:
"A a A a ( A a ) A ( a A ) a"
例如,我如何替换所有
A
s 与 T
s 仅在 (
之间和 )
获得:"A a A a ( T a ) A ( a T ) a"
并给出下一个示例输入:
"F f F f ( F f ) F ( f F ) f"
例如,我如何替换所有
F
s 与 X
s 但不在 (
之间和 )
到获得:
"X f X f ( F f ) X ( f F ) f"
我搜索了谷歌,但没有发现任何可用的东西。我想这是关于 sed 的一般问题。我希望这个问题可以归结为一般的 sed"template"。
对于 1. 和 2.
它应该适用于任何操作,不仅仅是替换,还适用于打印等,例如在字符串中打印字符串“FOO”和“BAR”之间的所有内容。
"1 2 3 BAR a b c FOO d e f BAR g a h FOO i j k BAR l m n FOO o p q"
结果将是
" d e f i j k "
因此,非常感谢有关如何执行此操作的一般示例。这个问题似乎也很常见,但在谷歌上还没有找到好的方法。我也猜这个
回答起来会很有挑战性。请也不要给出任何关于如何做的提示
使用 Perl、AWK 或 sed 以外的任何其他工具。这个问题实际上是一个仅限 sed 的问题。
最佳答案
分而治之。
插入换行符以分隔段,然后使用换行符、行首 ( ^
)、行尾 ( $
) 和定界符(在本例中为括号)作为 anchor 和循环。添加的换行符在最后被删除。
$ echo "A a A a ( A a ) A ( a A ) a" |
sed 's/([^)]*)/\n&/g;
:a;
s/\(\n([^)]*\)A\([^)]*)\)/\1T\2/;
ta;
s/\n//g'
A a A a ( T a ) A ( a T ) a
$ echo "F f F f ( F f ) F ( f F ) f" |
sed 's/(/\n(/g;
s/)/)\n/g;
:a;
s/\([^(]*\)F\([^)]*\(\n\|$\)\)/\1X\2/g;
ta;
s/\n//g'
X f X f ( F f ) X ( f F ) f
$ echo "1 2 3 BAR a b c FOO d e f BAR g a h FOO i j k BAR l m n FOO o p q" |
sed 's/^/BAR/;
s/$/FOO/;
s/FOO/&\n/g;
s/BAR/\n&/g;
s/BAR[^\n]*\n//g;
s/[^\n]*FOO\n//g;
s/\n//g'
d e f i j k
关于sed - 如何仅对部分线路进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4440455/