【问题标题】:Replacing Consecutive Values in Delimited File替换分隔文件中的连续值
【发布时间】:2013-09-11 11:03:52
【问题描述】:

最终目标是用 ^^ 替换所有 ^NULL^ 实例。对于这个问题,为了增加可读性,我将尝试将 ^NULL^ 替换为 ^fred^。这是我的测试数据。

/usr/redbrick_dir $ cat temp
a^NULL^b^c^
e^NULL^NULL^f^
g^h^i^NULL^

这是我期望的工作。

/usr/redbrick_dir $ cat temp | sed "s/\^NULL\^/\^fred\^/g"
a^fred^b^c^
e^fred^NULL^f^
g^h^i^fred^

请注意,在第 2 行中,仅替换了 ^NULL^ 的第一个实例。但是,如果我只使用一个分隔符运行命令,

/usr/redbrick_dir $ cat temp | sed "s/NULL\^/fred\^/g"
a^fred^b^c^
e^fred^fred^f^
g^h^i^fred^

我得到了想要的结果。如果我只使用尾随分隔符,我也会得到这些结果。问题是,为什么这个命令只替换 ^NULL^ 的第一个实例?

cat temp | sed "s/\^NULL\^/\^fred\^/g"

编辑从这里开始

当我尝试下面发布的几个答案时,发生了以下情况。

cat temp | sed "s/(?<=\^)NULL(?=\^)/fred/g"
a^NULL^b^c^
e^NULL^NULL^f^
g^h^i^NULL^

cat temp | sed ":a s/\^NULL^/^fred^/;ta"
sed: 0602-417 The label :a s/\^NULL^/^fred^/;ta is greater than eight characters.

我必须查看 Utopik 提供的链接。

【问题讨论】:

    标签: regex unix sed aix


    【解决方案1】:

    为什么这个命令只替换 ^NULL^ 的第一个实例?

    由于表达式与第二行中的第二个^NULL^ 不匹配,因此在表达式找到第一个^NULL^ 后,它现在尝试在^ 之后的字符处查找匹配:

    e^NULL^ NULL^f^
           ^
       it is now trying to find a match here but there is no ^NULL^ here, there is NULL^ only.
    

    Regex101 Demo

    我不知道sed 是否支持lookbehinds 或lookaheads 但如果支持,那么我会像这样进行替换:

    cat temp | sed "s/(?<=\^)NULL(?=\^)/fred/g"
    

    或者在你的情况下,当然用空字符串替换fred

    【讨论】:

      【解决方案2】:

      使用 GNU sed 测试

      首先,您可以删除一些反斜杠:sed "s/\^NULL^/^fred^/g" 无需任何更改(^ 没有任何意义,但在正则表达式的开头)

      然后,sed 将匹配^NULL^,并且该匹配中的任何字符都不能用于另一个匹配。所以,它不能匹配第二个^NULL^,而只能匹配NULL^,这就是它不起作用的原因。

      你可以这样做:

      sed ":a s/\^NULL^/^fred^/;ta"

      为什么?因为它会替换第一个^NULL^,然后重新开始替换,直到不再发生替换,因为这是一个新的替换循环,所以每个字符都可以匹配

      $ cat temp
      
      a^NULL^b^c^
      e^NULL^NULL^NULL^NULL^NULL^NULL^NULL^NULL^NULL^f^
      g^h^i^NULL^
      
      $ cat temp | sed ":a s/\^NULL^/^fred^/;ta"
      
      a^fred^b^c^
      e^fred^fred^fred^fred^fred^fred^fred^fred^fred^f^
      g^h^i^fred^
      

      没关系。

      (很多好资源:http://sed.sourceforge.net/grabbag/tutorials/

      【讨论】:

        【解决方案3】:
        There are two different scenarios:-
        
        1) In First sed command it is like that
        sed "s/\^NULL\^/\^fred\^/g" 
        

        当它来到第二行时。它正在搜索两个字符串,因为第一个是 ^NULL^,第二个是 NULL^。所以这里是无与伦比的。正因为如此,它并没有取代它。例如 sed 如何搜索单词 搜索词替换词 发现 ^空^ ^fred^ 未找到空^

        2) In second sed command it is like that sed "s/NULL\^/fred\^/g"
        

        这里只搜索单词 Null^ 并替换为 fred^ 。所以它正确匹配了这个词。

        【讨论】:

          猜你喜欢
          • 2022-11-30
          • 2012-07-15
          • 2019-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-17
          相关资源
          最近更新 更多