我正在尝试使用 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