使用 sed 在两个模式之间替换多个惰性字符串

2023-12-10

Example:

This (word1) is a test (word2) file.

我想要的是:

This is a test file.

问题是括号出现多次,所以如果我使用:

sed 's/<.*>//g'

I get This file这是错误的。


如果我想替换两个相同模式之间的字符串怎么样?

Like:

WORD1 %WORD2% WORD3 => WORD1 WORD3

您所需要的只是一个否定的字符类[^<>]*它将匹配除 a 之外的任何字符< or >:

sed 's/<[^<>]*>//g'

或者,如果您有圆括号,则可以使用[^()]*(请注意,在 BRE 语法中,要匹配文字( or )逃跑\没有必要):

sed 's/([^()]*)//g'

See IDEONE演示

至于更新,您可以删除所有内容WORD1 till WORD3 using .*, but 仅当只有一组时WORD1 and WORD3 (demo):

echo "WORD1 %WORD2% WORD3" | sed 's/WORD1.*WORD3/WORD1 WORD3/g'

With sed,不可能使用lookarounds(这里是lookaheads),也不可能使用惰性量词来将匹配限制在最左边WORD3发生。如果你确定不存在%之间的符号,您仍然可以使用否定字符类方法(demo):

echo "WORD1 %WORD2% WORD3" | sed 's/%[^%]*%//g'

通用解决方案就是分几个步骤来做:

  • 将开始和结束分隔符替换为未使用的字符 (<UC>)(我使用的是俄语字母,但它应该是一些控制字符)
  • 使用否定字符类<UC1>[^<UC1><UC2>]*<UC2>替换为必要的替换字符串
  • 恢复初始分隔符。

这是一个example:

#!/bin/bash
echo "WORD1 %WORD2% WORD3 some text WORD1 %WORD2% WORD3" | 
  sed 's/WORD1/й/g' |
  sed 's/WORD3/ч/g' |
  sed 's/й[^йч]*ч/й ч/g' |
  sed 's/й/WORD1/g' |
  sed 's/ч/WORD3/g' 
 // => WORD1 WORD3 some text WORD1 WORD3

我正在对一个空间进行硬编码,但可以在必要时进行调整。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 sed 在两个模式之间替换多个惰性字符串 的相关文章

随机推荐