在多字符定界符中无法识别管道

问题描述

我有一个|;|分隔的文件。 例子;

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

我需要将定界符更改为:或其他内容

但是FS中的awk对管道|不起任何作用

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命令。

解决方法

FS包含一个正则表达式,|在正则表达式中表示 alternative 。在管道上反斜杠以按实际方式匹配它们:

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

单个管道正常工作的原因是一个字符的FS:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...