多行匹配多个字符串,也可以替换多个字符串
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"
两行都用于匹配,单行不会更改。
我想在单个匹配中将第一行中的所有字符串替换为 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"
两行都用于匹配,单行不会更改。