首页 > 解决方案 > 在多字符分隔符中时无法识别管道

问题描述

我有一个用|;|. 例子;

1|;|2|;|3|;|4|;|5
1|;|2|;|3|;|4|;|5

我需要将分隔符更改为:或其他内容,

FSinawk对管道没有任何作用|

awk '$1=$1' FS="|;|" OFS=":" file

1|:|2|:|3|:|4|:|5
1|:|2|:|3|:|4|:|5 

管道|在用作单个字符分隔符时被识别;

awk '$1=$1' FS="|" OFS="" file

1:2:3:4:5
1:2:3:4:5 

但是,sed解决了这个问题,

sed 's/|;|/:/g' file

但我想知道是否有办法处理awk命令。

标签: linuxunixpipedelimiterseparator

解决方案


FS 包含一个正则表达式,|表示正则表达式中的替代。反斜杠以匹配它们的字面意思:

awk '$1=$1' FS='\\|;\\|' OFS=:

单个管道工作的原因是单字符 FS 被特殊处理:

如果 FS 是单个字符,则字段由该字符分隔。如果 FS 是空字符串,那么每个单独的字符将成为一个单独的字段。否则,FS 应该是一个完整的正则表达式。在 FS 是单个空格的特殊情况下,字段由空格和/或制表符和/或换行符分隔。


推荐阅读