0

我想在单个匹配中将第一行中的所有字符串替换为 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>)/\1FALSE\2TRUE\3/' test.xml

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

4

2 回答 2

1

换行符将-z作为普通字符处理:

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

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

\1=SYN DISPLAY=
\2="TRUE"
\3= SEARCH="TRUE" CLASSIFY="TRUE">Appels</SYN>
\4= <
\5="FALSE"

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

于 2020-04-18T13:11:45.490 回答
1

从我的角度来看,如果您不想进入复杂的正则表达式,实现这一目标的最简单方法是使用临时值,如下所示:

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
于 2020-04-17T21:13:20.407 回答