Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如果未使用awk逃逸,则使用字段指示器_Unix_Awk - Fatal编程技术网

Unix 如果未使用awk逃逸,则使用字段指示器

Unix 如果未使用awk逃逸,则使用字段指示器,unix,awk,Unix,Awk,我有一个问题,假设我使用=作为fiels分隔符,在这种情况下,如果我的字符串包含例如 abc=def\=jkl 所以,如果我使用=作为字段分隔符,它将作为 abc def\ jkl 但由于我已经逃过了2nd=,我的输出应该是 abc def\=jkl 如果我能做到这一点,谁能给我一些建议。 提前感谢如果这与您问题中的示例类似,则可以完成 awk不支持look-around正则表达式。因此,通过设置FS来获得您想要的东西会有点困难 如果我是你,我会做一些预处理,使数据更容易被awk处理。

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

abc=def\=jkl 
所以,如果我使用=作为字段分隔符,它将作为

abc def\ jkl 
但由于我已经逃过了2nd=,我的输出应该是

abc def\=jkl
如果我能做到这一点,谁能给我一些建议。
提前感谢

如果这与您问题中的示例类似,则可以完成

awk不支持look-around正则表达式。因此,通过设置FS来获得您想要的东西会有点困难

如果我是你,我会做一些预处理,使数据更容易被awk处理。或者您可以读取该行,并使用awk的其他功能,例如gensub删除您不希望在结果中出现的那些=s,然后拆分。。。但是我猜你想通过游戏来实现这个目标,所以我不给出这些解决方案

然而,它可以通过FPAT变量来完成

awk -vFPAT='\\w*(\\\\=)?\\w*' '...' file
这将适用于您的示例。我不确定它是否适用于您的真实数据

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


如果它像你问题中的例子,它是可以做到的

awk不支持look-around正则表达式。因此,通过设置FS来获得您想要的东西会有点困难

如果我是你,我会做一些预处理,使数据更容易被awk处理。或者您可以读取该行,并使用awk的其他功能,例如gensub删除您不希望在结果中出现的那些=s,然后拆分。。。但是我猜你想通过游戏来实现这个目标,所以我不给出这些解决方案

然而,它可以通过FPAT变量来完成

awk -vFPAT='\\w*(\\\\=)?\\w*' '...' file
这将适用于您的示例。我不确定它是否适用于您的真实数据

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


我发现最简单的方法是将有问题的字符串转换为输入记录中没有出现的其他字符串或字符如果不是regexp*,我倾向于使用RS,因为它不能出现在记录中,或awk内置子集,因为如果输入中出现此问题,则您有其他问题,然后按正常方式处理,而不是在必要时在每个字段内转换回,例如:

$ 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
*如果是RE,即多个字符,则使用RS的问题在于gsubRS。。。在循环中,可以匹配最初未解析为记录分隔符的字符串,例如

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

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

我发现最简单的方法是将有问题的字符串转换为输入记录中没有出现的其他字符串或字符。如果RS不是regexp*,我倾向于使用RS,因为它不能出现在记录中,或awk内置子集,因为如果输入中出现此问题,则您有其他问题,然后按正常方式处理,而不是在必要时在每个字段内转换回,例如:

$ 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
*如果是RE,即多个字符,则使用RS的问题在于gsubRS。。。在循环中,可以匹配最初未解析为记录分隔符的字符串,例如

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

当RS是单个字符(例如默认换行符)时,这种情况不会发生,因此可以安全使用。

+1 ED,我总能从您那里学到新的东西!你是awk大师!但如果我真的在做这个,我不会用你的或我的解决方案,我会做一些预处理。无论如何+1表示我没有想到的技巧。@Kent-是的,如果我有一个大的awk脚本,并且有一个我知道不能出现在输入中的方便的控件字符,那么我会做sed's/old/new/'| awk'real work'| sed's/new/old/,只是为了将这些绒毛与实际工作分开。如果我想使用一个不是单个字符的RS,并且我不想特定于gawk,也可以这样做。上面使用RS的方法的可爱之处在于,你不需要识别一个不能出现在你的输入中的字符串,我认为这是一个很有吸引力的解决方案。但我仍然觉得它不正确,我将它作为输出abc def和jkl分开,我不了解RS的限制可能你使用的是旧的,Solaris上的awk/bin/awk损坏?我发布的脚本将在任何其他awk中工作。试试awk版本,看看它能告诉你什么。另外,用一个副本/过去更新您的问题,以显示输入文件、运行awk命令以及获得的确切输出。@chandra-我不是要求您继续运行awk-版本并将结果发布在注释中,我要求你对输入文件进行分类,运行我发布的脚本,并将屏幕内容复制/粘贴到原始问题中,这样我们就可以看到你运行的内容以及准确的输出。+1 ED,我总能从你那里学到新东西!你是awk大师!但如果我真的在做这个,我不会用你的或我的解决方案,我会做一些预处理。无论如何+1表示我没有想到的表演技巧。@Ken
是的,如果我有一个大的awk脚本,并且有一个我知道不能出现在输入中的方便的控件字符,那么我会做sed's/old/new/'| awk'real work'| sed's/new/old/|只是为了将这些绒毛从实际工作中分离出来。如果我想使用一个不是单个字符的RS,并且我不想特定于gawk,也可以这样做。上面使用RS的方法的可爱之处在于,你不需要识别一个不能出现在你的输入中的字符串,我认为这是一个很有吸引力的解决方案。但我仍然觉得它不正确,我将它作为输出abc def和jkl分开,我不了解RS的限制可能你使用的是旧的,Solaris上的awk/bin/awk损坏?我发布的脚本将在任何其他awk中工作。试试awk版本,看看它能告诉你什么。另外,用一个副本/过去更新您的问题,以显示输入文件、运行awk命令以及获得的确切输出。@chandra-我不是要求您继续运行awk-版本并将结果发布在注释中,我要求你对输入文件进行分类,运行我发布的脚本,并将屏幕内容复制/粘贴到原始问题中,这样我们就可以看到你运行的内容以及该问题的确切输出。感谢你的输入,但我尝试了这一点,但我将整个字符串作为输出,即abc=def\=jkl=foo\=bar=baz,而不是单独的一个。为什么awk不能用转义的分隔符限制输入,但我已经尝试过了,但我得到的是整个字符串作为输出,即abc=def\=jkl=foo\=bar=baz,但不是单独的一个。为什么awk不能使用转义的分隔符进行限制