如何替换文件中由另外两个字符分隔的间隔内的字符

如何替换文件中由另外两个字符分隔的间隔内的字符

当文件每一行中竖线字符出现在和字符之间时,我必须|用逗号替换所有出现的竖线字符。,[]

假设文件中有以下字符串:

wah wah| [go great|no great|so great] | wah wah | [go great|no great|so great]

我希望我的输出如下所示:

wah wah| [go great,no great,so great] | wah wah | [go great,no great,so great]

请注意,可以有多个[...对。第一个和第二个]之间的竖线不应改变。][

如何使用 shell 命令实现此目的?我尝试了下面几种方法,但都不起作用。

sed '/[/,/]/s/|/,/g' abcd.csv

答案1

sed':循环;s/\(\[[^][]*\)|\([^][]*\]\)/\1,\2/;t 循环'输入文件

这是怎么回事?

  • : loop是一个循环标签;我稍后会用到它。
  • s/\(\[[^][]*\)|\([^][]*\]\)/\1,\2/取代 |出现在[和之间,中间]用逗号隔开。细分如下:

    s/  \(  \[  [^][]  *  \)  |  \(  [^][]  *  \]  \)  /  \1,\2  /
    
    • \(\)界定搜索和替换组。给定一个[… ,其中]有一个|,则匹配[ 向上(但不包括)最后一个| 作为一个组,以及|up之后的所有内容通过(包括)]作为第二组。
    • \[匹配文字[
    • [^][]匹配除[或之外的任何字符]。它分解为
      [ ^ ][ ]
      [^不匹配的字符]
    • *— 零个或多个除[或之外的字符]
    • \)— 小组结束;如上所述。
    • |是一个文字|(我们想要替换的文字)。
    • 正则表达式的后半部分与前半部分几乎相同:匹配由零个或多个除 或 之外的字符组成的组[]后跟一个]
    • 然后将所有内容替换为第一组、逗号和第二组。由于匹配字符串中的所有内容(除了 )都在其中一个组中,因此|这实际上将 替换\,
  • t loop— 测试/传输。如果s 命令找到匹配项并进行了替换,则返回标签并重试(因为命令一次s 只能替换一个|)。如果没有找到匹配项,则终止命令脚本并继续下一行。

相关内容