gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:25:42 25 4
gpt4 key购买 nike

例子:

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

我想要的:

This is a test file.

问题是括号出现了不止一次,所以如果我使用:

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

我得到了错误的This file


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

喜欢:

WORD1 %WORD2% WORD3 => WORD1 WORD3

最佳答案

您只需要一个否定字符类 [^<>]*这将匹配除 < 以外的任何字符或 > :

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

或者,如果你有圆括号,你可以使用 [^()]* (请注意,在 BRE 语法中,匹配文字 () 不需要转义 \):

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

参见 IDEONE demo

至于更新,您可以从WORD1中删除所有内容直到 WORD3使用 .* , 但 只有当只有一组 WORD1WORD3 ( demo ):

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

, 不可能使用 lookarounds (lookaheads here), 也不能使用惰性量词将匹配限制在最左边 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

我正在对空格进行硬编码,但可以在需要时对其进行调整。

关于regex - 使用 sed 在两个模式之间替换多个惰性字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34311692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com