使用 sed 正则表达式插入第三列

使用 sed 正则表达式插入第三列

我正在尝试使用 sed 插入第三列,其中列分隔符是竖线字符“|”。问题是文本中的列总数未知,但至少为 2。例如,我想添加带有文本“foo”的第三列:

abc|def ---> abc|def|foo
abc|def|jkl ---> abc|def|foo|jkl

我更喜欢sed这个选项,而且我想我可以通过一些复制-i来完成。awk

我试过:

$ echo "abc|def|jkl" | sed -r 's/^(.*|)(.*)([|$])/\1\2|foo\3/' 
abc|def|foo|jkl

但这对两列不起作用:

$ echo "abc|def" | sed -r 's/^(.*|)(.*)([|$])/\1\2|foo\3/' 
abc|foo|def

我也尝试了一些其他的代码,但我想这是我最好的尝试。

答案1

根据提供的资源,我刚刚编辑了你的正则表达式的某些部分,并根据它制作了一个可能按预期工作的简单解决方案。

OR布尔值的使用|可以在正则表达式分组正则表达式方程的第三部分中完成。

此解决方案仅适用于您提供的上述示例。

echo "abc|def" | sed -r 's/(.*\|)(.*)(\|.*|$)/\1\2|foo\3/'

取得的成果:

abc|def|foo

其他部分:

echo "abc|def|jkl" | sed -r 's/(.*\|)(.*)(\|.*|$)/\1\2|foo\3/'

输出:

abc|def|foo|jkl

异常部分(在之后给出额外的部分|):

echo "abc|def|jkl|asd" | sed -r 's/(.*\|)(.*)(\|.*|$)/\1\2|foo\3/'

输出:

abc|def|jkl|foo|asd

编辑:更准确的正则表达式每次插入第三列。

echo "abc|def|jkl|asd|kjfwk" | sed -r 's/^([a-z]*\|[a-z]*\|)(.*)/\1foo|\2/'

答案2

使用n标志s来替代第二场比赛anything other than '|' character

sed 's/[^|]*/&|foo/2' file

对于只有一列的情况,可以添加空的第二列:

sed -e ':a' -e 's/[^|]*/&|foo/2;t' -e 's/$/|/;t a' file

检查:

$ cat file
xyz
xyz|uvw|rst|opq|lmn
abc|def
abc|def|jkl
$ sed ':a
> s/[^|]*/&|foo/2;t
> s/$/|/;t a' file
xyz||foo
xyz|uvw|foo|rst|opq|lmn
abc|def|foo
abc|def|foo|jkl

相关内容