拆分包含管道符的字符串

Hak*_*kim 2 linux bash awk text sed

我正在使用一些包含字段分隔符的文本,它们是"||||":

substring1||||substring2
Run Code Online (Sandbox Code Playgroud)

子字符串也可能包含空格.我想根据分隔符"||||"拆分这些字符串,但我找不到合适的方法来做到这一点.我尝试了以下命令:

echo "substring1||||substring2" | awk '{split($0,a,"||||"); a[2],a[1]}'
Run Code Online (Sandbox Code Playgroud)

实际上,如果我只有一个"|"那个命令有效 作为分隔符.但我的问题是我有多个管道角色.

我也试过了

a=($(echo "substring1||||substring2" | sed -e "s/||||/\n/g")) 
Run Code Online (Sandbox Code Playgroud)

如果子字符串不包含空格,它可以正常工作.但由于子字符串可能包含空格,因此它们也会在空格中分割,这是不希望的.

任何的想法?

Bir*_*rei 9

使用正则表达式作为输入字段分隔符,如:

awk -F'[|]{4}' '{ printf "Field 1 -> %s\nField 2 -> %s\n", $1, $2 }' infile
Run Code Online (Sandbox Code Playgroud)

假设infile有内容:

sub string 1||||sub string2
Run Code Online (Sandbox Code Playgroud)

它产生:

Field 1 -> sub string 1
Field 2 -> sub string2
Run Code Online (Sandbox Code Playgroud)

编辑:对于awk不接受{n}语法使用的旧版本,-F'[|][|][|][|]'或者-F'[|]+'改为:

awk -c -F'[|]+' '{ printf "Field 1 -> %s\nField2 -> %s\n", $1, $2 }' infile
Run Code Online (Sandbox Code Playgroud)

另外--re-interval,感谢blue的评论:

awk -c --re-interval -F'[|]{4}' '{ printf "Field 1 -> %s\nField2 -> %s\n", $1, $2 }' infile 
Run Code Online (Sandbox Code Playgroud)