当文件每一行中竖线字符出现在和字符之间时,我必须|
用逗号替换所有出现的竖线字符。,
[
]
假设文件中有以下字符串:
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
只能替换一个|
)。如果没有找到匹配项,则终止命令脚本并继续下一行。