1

我有一个问题,假设我使用“=”作为字段分隔符,在这种情况下,如果我的字符串包含例如

abc=def\=jkl 

所以如果我使用 = 作为字段分隔符,它将分成 3 为

abc def\ jkl 

但是因为我已经逃脱了第二个 "=" ,所以我的输出应该是

abc def\=jkl

如果我能做到这一点,任何人都可以给我任何建议。提前致谢

4

2 回答 2

3

我发现将有问题的字符串转换为不出现在输入记录中的其他字符串或字符最简单(如果它不是正则表达式*,我倾向于使用 RS,因为它不能出现在记录中,或者 awk 内置 SUBSEP否则,因为如果出现在您的输入中,您还有其他问题)然后正常处理,而不是在必要时在每个字段中转换回来,例如:

$ cat file
abc=def\=jkl

$ awk -F= '{
   gsub(/\\=/,RS)
   for (i=1; i<=NF; i++) {
      gsub(RS,"\\=",$i)
      print i":"$i
   }
}' file
1:abc
2:def\=jkl

* 如果 RS 是 RE(即多个字符),则使用 RS 的问题是循环中的 gsub(RS...) 可能会匹配最初未解析为记录分隔符的字符串,例如

$ echo "aa" | gawk -v RS='a$' '{gsub(RS,"foo",$1); print "$1=<"$1">"}'
$1=<afoo>

当 RS 是单个字符时,例如默认换行符,这是不可能发生的,因此可以安全使用。

于 2013-04-04T15:55:18.510 回答
1

如果它就像您问题中的示例,则可以完成。

awk 不支持环视正则表达式。所以通过设置来获得你想要的东西会有点困难FS

如果我是你,我会做一些预处理,让数据更容易被 awk 处理。或者您可以阅读该行,并通过 awk 使用其他功能,例如gensub()删除那些=您不想在结果中出现的 s,并且split...但我想您想通过 play 来实现目标field separator,所以我只是不t 给出这些解决方案。

但是它可以通过FPAT变量来完成。

awk -vFPAT='\\w*(\\\\=)?\\w*' '...' file

这将适用于您的示例。我不确定它是否适用于您的真实数据。

让我们举个例子,分割这个字符串:"abc=def\=jkl=foo\=bar=baz"

kent$  echo "abc=def\=jkl=foo\=bar=baz"|awk -vFPAT='\\w*(\\\\=)?\\w*' '{for(i=1;i<=NF;i++)print $i}'
abc
def\=jkl
foo\=bar
baz

我想你想要那个结果,不是吗?

我的 awk 版本:

kent$  awk --version|head -1
GNU Awk 4.0.2
于 2013-04-04T15:49:03.093 回答