Awk 存在+;在最后一个字段中签名

Awk 存在+;在最后一个字段中签名,awk,character,Awk,Character,各位: 我在向awk sub命令传递包含最后一个字段中的+符号的字符串时遇到问题。我试图输出记录中除最后一个字段外的所有字段,但不使用尾随字段分隔符。例如: echo "dog cat fish hamster" | awk 'sub(FS $NF, x)' 这将产生所需的“狗-猫-鱼”输出 这会产生似乎没有输出的结果 echo "dog +cat fish hamster" | awk 'sub(FS $NF, x)' 这也产生了“狗+猫鱼”的预期输出 我使用awk解析一个配置文件,其中包

各位:

我在向awk sub命令传递包含最后一个字段中的+符号的字符串时遇到问题。我试图输出记录中除最后一个字段外的所有字段,但不使用尾随字段分隔符。例如:

echo "dog cat fish hamster" | awk 'sub(FS $NF, x)'
这将产生所需的“狗-猫-鱼”输出

这会产生似乎没有输出的结果

echo "dog +cat fish hamster" | awk 'sub(FS $NF, x)'
这也产生了“狗+猫鱼”的预期输出

我使用awk解析一个配置文件,其中包含一个或多个源目录和一个目标目录,用于使用scp传输文件。一些目标目录有一个+,例如/app/tgv+/in,由于遗留代码,我无法更改装载点。只有在最后一个字段中出现+时,问题才会出现。如果您能帮助我确定我是否做错了什么,或者这仅仅是awk字符串解析器的问题,我将不胜感激。非常感谢您的帮助


DGC

这里的问题是
sub()
的第一个参数应该是正则表达式。在大多数匹配绝对字符串的情况下,这并不麻烦。但在你的情况下
FS$NF
将成为
+仓鼠
,它将被视为正则表达式,因此不会与任何内容匹配,因此任何内容都不会被打印

即使您使用类似于
{1}仓鼠
的东西而不是
+仓鼠
,也不会有任何输出

更好的办法是改变方式。可以使用一种简单的方法

echo "dog cat fish +hamster" | awk 'NF--'

您的
sub
函数看起来很奇怪。您想删除
+
或包含
+
的整个单词吗?预期的行为是输出除最后一个输入字段外的所有字段。这项工作直到正则表达式特殊符号进入输入,如下面的答案所示。感谢您抽出时间发表评论。+1!还有一个问题是
awk
脚本有问题。请参见
echo“dog-cat-graster-fish-graster”| awk'sub(FS$NF,x)
,结果:
dog-cat-fish-graster
。我在寻找打印每行最后一个字段以外的所有字段的方法时找到了自己的特殊方法。您对另一种方法的响应确实有效,但我的方法是作为一种方法提供的,它可以在不输出尾随字段分隔符的情况下生成输出。我已经求助于NF--方法,它的功能是正确的。我根本没想到awk会将内部变量的值转换成正则表达式。非常感谢您花时间解释。复制问题也是一个问题,除了配置文件是手动创建的,并且包含未复制的文件系统装入点,这不会产生问题。当目标装载点包含在路径本身中,而我无法让程序员更改它时,问题就出现了。谢谢你指出另一个可能的问题。
echo "dog cat fish +hamster" | awk 'NF--'