加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

sed – 如何仅在部分线路上运行

发布时间:2020-12-14 01:54:11 所属栏目:Linux 来源:网络整理
导读:如何仅对一行的特定部分进行sed操作?而且,相反,我如何使sed不能在一行的特定部分工作? 例子: "A a A a ( A a ) A ( a A ) a" 例如,我如何仅在(和)之间替换所有As与Ts以获得: "A a A a ( T a ) A ( a T ) a" 并给出下一个示例输入: "F f F f ( F f ) F (
如何仅对一行的特定部分进行sed操作?而且,相反,我如何使sed不能在一行的特定部分工作?

例子:

"A a A a ( A a ) A ( a A ) a"

例如,我如何仅在(和)之间替换所有As与Ts以获得:

"A a A a ( T a ) A ( a T ) a"

并给出下一个示例输入:

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

例如,我如何用X替换所有Fs,而不用(和)替换所有Fs
获得:

“X f X f ( F f ) X ( f F ) f”

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

>让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问题.

解决方法

分而治之.

插入换行符以分隔段然后使用换行符,行开头(^),行结束($)和分隔符(本例中为圆括号)作为锚点和循环.最后删除添加的换行符.

$echo "A a A a ( A a ) A ( a A ) a" |
    sed 's/([^)]*)/n&/g; 
         :a; 
           s/(n([^)]*)A([^)]*))/1T2/;
         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|$))/1X2/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]*FOOn//g;
         s/n//g'
 d e f  i j k

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读