【问题标题】:Remove the "^M" at the and of each line when its doesnt match Perl当与 Perl 不匹配时,删除每行和的“^M”
【发布时间】:2023-03-03 16:51:01
【问题描述】:

当每行不匹配时,如何删除每行和的“^M”?命令是:

perl -pe 's{(">)[^</zone>]}{$1</zone>}g' $travail_dir/zones.txt >$travail_dir/ys.txt

我在我的 ys.txt 中得到了这个:

<zone^M
numero_page="005"></zone>^M
<zone^M
id_zone="2"^M
numero_page="005"></zone>

如何修改我的命令以获得没有“^M”的预期结果?

【问题讨论】:

  • [^&lt;/zone&gt;] 是错误的,你是说("&gt;)(?!&lt;/zone&gt;) 吗?试试perl -pe 's/\r//g;s{("&gt;)(?!&lt;/zone&gt;)}{$1&lt;/zone&gt;}g'
  • 谢谢@WiktorStribiżew 是的,你是对的,你救了我,谢谢
  • @choroba 用正则表达式解析有效的 XML 确实是个坏主意,但在这里,XML 是无效的,OP 会尝试使其有效以使其可解析。
  • 也许您从 MS Windows 获得了该文件并在 Linux 中使用它。 Windows 和 Unix 有不同的行尾。您可以使用编辑器vim 进行所需的更改,在大多数情况下已安装。使用编辑器vim filename 打开文件,在编辑器中发出命令:set ff=unix 并保存文件:wq。或者,如果您的系统中有可用的实用程序dos2unix,您可以使用它。

标签: regex perl regex-lookarounds


【解决方案1】:

这里有两件事:

  • [^&lt;/zone&gt;] 匹配除&lt;/zone&gt; 之外的任何单个字符,它并不表示 * 除 &lt;/zone&gt; 之外的任何文本。您需要在此处使用负前瞻,(?!&lt;/zone&gt;) 如果直接跟在&lt;/zone&gt; 后面,则"&gt; 匹配将失败
  • ^M回车,CR 符号,您可以在将文件传递给 perl 之前使用 dos2unix 删除它们,或者使用单独的替换命令 s/\r//g 删除它们。

你可以使用

perl -pe 's/\r//g;s{(">)(?!</zone>)}{$1</zone>}g' $travail_dir/zones.txt > $travail_dir/ys.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2014-09-19
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多