多行匹配多个字符串,也可以替换多个字符串

Match multiple strings in multi lines and also replace multiple strings

我想在单个匹配中将第一行中的所有字符串替换为 DISPLAY="TRUE" 到 DISPLAY="FALSE" ,反之亦然。

示例: 来自:

 <SYN DISPLAY="TRUE" SEARCH="TRUE" CLASSIFY="TRUE">Appels</SYN>
 <SYN DISPLAY="FALSE" SEARCH="FALSE" CLASSIFY="TRUE">103.103117.1031171012</SYN>

 <SYN DISPLAY="FALSE" SEARCH="TRUE" CLASSIFY="TRUE">Appels</SYN>
 <SYN DISPLAY="TRUE" SEARCH="FALSE" CLASSIFY="TRUE">103.103117.1031171012</SYN>

请注意,<SYN DISPLAY="TRUE" or <SYN DISPLAY="FALSE" 对应行中的所有其他字符串可能不同。

要求仅在两行出现时匹配和替换(如上所示),即当 <SYN DISPLAY="TRUE" 在第一行且 <SYN DISPLAY="FALSE" 在第二行时。不应替换具有以下示例模式的单行。

<DIMENSION_NODE>
            <DVAL TYPE="EXACT">
               <DVAL_ID ID="4294960976"/>
               <SYN DISPLAY="TRUE" SEARCH="TRUE" CLASSIFY="TRUE">2</SYN>
            </DVAL>
         </DIMENSION_NODE>
    ```


我尝试使用 sed,但是,我无法让它工作。

sed -E 's/(<SYN DISPLAY=\")TRUE(\".+\s+<SYN DISPLAY=\")FALSE(\".+<\/SYN>)/FALSETRUE/' test.xml

请求专家帮助使其工作:)

在我看来,如果您不想陷入复杂的正则表达式,最简单的实现方式就是使用临时值,如下所示:

sed \
    -e 's/DISPLAY="TRUE"/TMP/g' \
    -e 's/DISPLAY="FALSE"/DISPLAY="TRUE"/g' \
    -e 's/TMP/DISPLAY="FALSE"/g' YOUR_FILE

或者,作为单行:

sed -e 's/DISPLAY="TRUE"/TMP/g' -e 's/DISPLAY="FALSE"/DISPLAY="TRUE"/g' -e 's/TMP/DISPLAY="FALSE"/g' YOUR_FILE

使用 -z 时,换行符将作为普通字符处理:

sed -zr 's/(SYN DISPLAY=)("TRUE")([^\n]*)\n([^\n]*)SYN DISPLAY=("FALSE")/\n/g' inputfile

在您的示例中,记住的字符串是:

=SYN DISPLAY=
="TRUE"
= SEARCH="TRUE" CLASSIFY="TRUE">Appels</SYN>
= <
="FALSE"

两行都用于匹配,单行不会更改。