sed - 如何仅对部分线路进行操作

标签 sed

如何使 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"。
  • 具有 FROM 和 TO 然后仅在它们之间操作(在给定行上的所有出现处)
  • 让 FROM 和 TO 在它们之间的任何地方运行...
  • 当 FROM 和 TO 相同时的特殊情况(在“和”或“FOO”和“FOO”等之间)
    对于 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/

    相关文章:

    regex - Sed 捕获组不工作

    git - 将 .gitignore 转换为 rsync merge 过滤器包含文件? (使用 sed 或 awk)

    regex - 根据 sed 的反向引用将字符串替换为另一个字符串

    regex - 删除 key :value pair from json file using shell script

    search - 什么 sed 脚本可以用另一个十六进制字符替换一系列十六进制字符

    bash - 提取每个 ID 的主要号码和次要号码并生成 JSON 字符串

    linux - 根据另一个文件内容的精确匹配重命名部分文件名

    shell - 如何在两个相同的标记模式之间获取特定数据

    sed - 通过搜索最后几行的模式来查找文件名

    regex - 使用 grep 或 sed 的正则表达式不起作用