如何仅在部分线路上操作

mjf*_*mjf 6 sed

如何仅对一行的特定部分进行sed操作?而且,相反,我如何使sed不能在一行的特定部分工作?

例子:

"A a A a ( A a ) A ( a A ) a"
Run Code Online (Sandbox Code Playgroud)

我如何,例如,更换所有A与S T小号之间(,并)获得:

"A a A a ( T a ) A ( a T ) a"
Run Code Online (Sandbox Code Playgroud)

并给出下一个示例输入:

"F f F f ( F f ) F ( f F ) f"
Run Code Online (Sandbox Code Playgroud)

我如何,例如,更换所有F与S X秒,但不是(,并)获得:

"X f X f(F f)X(f F)f"

我搜索了谷歌,但没有找到任何可用 我想这是关于sed的一般性问题.我希望这个问题可以简化为一般的sed"模板".

  1. 然后让FROM和TO在它们之间运行(在给定行的所有事件中)
  2. 让FROM和TO在他们之间的任何地方运作......
  3. 对于1和2,FROM和TO相同(在"和"或"FOO"和"FOO"等之间)的特殊情况.

它应该适用于任何操作,不仅仅是替换,还可以用于打印等,比如在字符串中的字符串"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"
Run Code Online (Sandbox Code Playgroud)

结果将是

" d e f  i j k "
Run Code Online (Sandbox Code Playgroud)

因此,非常感谢如何做到这一点的一般例子.似乎这个问题很常见,但谷歌还没有找到好的方法.我也猜想回答这个问题非常具有挑战性.请不要使用Perl,AWK或除sed以外的任何其他方式提供任何有关如何使用它的提示.这个问题实际上只是一个sed问题.

Pau*_*ce. 1

分而治之。

插入换行符来分隔段,然后使用换行符、行开头 ( ^)、行结尾 ( $) 和分隔符(在本例中为括号)作为锚点和循环。添加的换行符在最后被删除。

$ 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
Run Code Online (Sandbox Code Playgroud)