【问题标题】:Cygwin Sed - One expression to match string at beginning and not match at endCygwin Sed - 一个表达式在开头匹配字符串但在结尾不匹配
【发布时间】:2014-04-04 15:55:31
【问题描述】:

我一直在尝试找到一个与 cygwin 的 sed 兼容的 sed 脚本,该脚本将匹配行

^<Transaction> 和没有</Transaction>$

我需要一种表达方式。当行匹配时,我需要删除行结尾或将下一行附加到当前行的末尾。

问题是我们有 xml 被转储,当行长两行时,它会将其拆分为 2 行。

【问题讨论】:

  • 该死,它删除了我放在引号中的内容, 在前面,但不是 在末尾。
  • 如果你的意思是regexNO 行只有^ 但没有$ .....
  • 文件不太可能包含文字 ^$ -- 你确定吗?
  • 我想匹配以 开头但末尾没有 的行。我添加了 ^ 和 $ 来显示行的开始和结束。
  • 我不是在解析 XML,如果我想在标签之间找到值,我会解析 XML "............我不是我是逐行替换,sed 的用途是什么............在你提出愚蠢的建议之前阅读。

标签: regex linux bash sed cygwin


【解决方案1】:

Perl 的救援:

perl -pe 'chomp if /^<Transaction>/ and not /<\/Transaction>$/' file

【讨论】:

  • 我不明白为什么这不起作用。它不适合我。
【解决方案2】:

使用 sed:

sed '/^<Transaction>/{/<\/Transaction>$/!{N;s/\n/ /}}'

它的工作原理如下。对于以&lt;Transaction&gt; 开头但不是&lt;/Transaction&gt; 结尾的行,追加下一行,并用空格替换换行符。所有其他行保持不变。

如果不需要添加的空间,只需将/ / 更改为//。如果原始文件的任何行被分割成三个,请运行该命令两次。

【讨论】:

    【解决方案3】:
    sed ':0 /<\/Transaction>$/!N;s/\(^<Transaction>.*\)\n/\1/;t0'
    

    搜索不以&lt;/Transaction&gt;结尾的行,追加下一行(\n还在),检查这个合并的行是否以&lt;Transaction&gt;开头,如果是——删除\n\1 是对包含 \(\)) 中的模式的第一组的反向引用,否则什么也不做;如果\n 被删除,则重复。

    适用于测试 XML 文件:

    <NotATransaction>a</NotATransaction>
    <NotATransaction>b1
    b2</NotATransaction>
    <Transaction>A</Transaction>
    <Transaction>B1
    B2
    B3
    B4
    B5</Transaction>
    <Transaction>C1
    C2</Transaction>
    <Transaction>D</Transaction>
    

    【讨论】:

    • 这可行,但有一个问题,它匹配不以 Transaction 开头和不以 Transaction 结尾的行,例如:
    • @user3211352 修复了这个问题
    • @user3211352 对我们环境中的这个测试文件有效吗?
    • 为您测试复制和粘贴的作品,而不是我的文件。
    • @user3211352 如果您上传示例文件并在此处提供链接,它可能有助于解决问题。可能的原因之一是元素周围有尾随空格,因此这些 ^......$ 正则表达式与它们不匹配。
    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2019-09-13
    • 2016-12-07
    • 2018-02-13
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多