【问题标题】:SED remove white space between charactersSED 删除字符之间的空格
【发布时间】:2017-03-17 00:08:58
【问题描述】:

我有一个 xml 文件,其行应如下所示:

<item id=""><myname>FIRST NAME</myname><myurl>http://etc.com</myurl></item>

我可以轻松地替换下面的" myurl=" 以使线条看起来像上面的那样。

<item id=""><myname>FIRST NAME" myURL="http://etc.com</myurl></item>

不幸的是,它们中的大多数看起来像这样,在 b/t 中有不同数量的空白:

<item id=""><myname>FIRST NAME"                   
         myURL="http://etc.com</myurl></item>

我似乎无法为 b/t 字符中的空格找到有效的 SED 替换

【问题讨论】:

  • 您的 XML 在 中的格式不正确 - 这是故意的吗?
  • 最后一个是换行还是因为空格太多而换行了?

标签: unix sed


【解决方案1】:

正则表达式's/ */ /g' 是您要查找的内容吗?

对于所有两个或多个空格的字符串,这将替换一个空格。

【讨论】:

  • 这是第一个斜线和星号之间的三个空格(不容易看到)。
  • 's/ +/ /g'(第一个斜线和加号之间有两个空格 - 此站点上突出显示的代码似乎对于问题/答案帖子和 cmets 的工作方式不同......)应该做同样的事情。 * 表示前面的字符可以出现任意次数(包括零次),+ 表示“一次或多次”。
  • 我有时也喜欢使用's/[ \t]+/ /g',它实际上用一个空格字符替换了任意数量的重复出现的空格或制表符。不过要小心:虽然sed -r 通常确实支持\t,但您需要通过声明-P 来显式使用Perl regex 来表示grep
【解决方案2】:
sed '/myname>.*\"\s*$/N;s|\"\s*\n*\s*myURL=\"|</myname><myurl>|' file.xml

这首先测试该行是否不完整。如果是,则将下一行放入模式空间。在任何一种情况下,它都会用所需的文本替换原始文本。

顺便说一句,如果有人能告诉我一种在字符集中匹配模式空间中的换行符的方法,我将不胜感激。例如,[\s\n]* 而不是上述表达式中的\s*\n*\s*

输入:

<item id=""><myname>FIRST NAME" myURL="http://etc.com</myurl></item>
<item id=""><myname>FIRST NAME"                   
         myURL="http://etc.com</myurl></item>
<item id=""><myname>FIRST NAME" myURL="http://etc.com</myurl></item>

输出:

<item id=""><myname>FIRST NAME</myname><myurl>http://etc.com</myurl></item>
<item id=""><myname>FIRST NAME</myname><myurl>http://etc.com</myurl></item>
<item id=""><myname>FIRST NAME</myname><myurl>http://etc.com</myurl></item>

【讨论】: