[英]How to get only lines with a single quote using GNU sed in Bash shell?
[英]Bash quote behavior and sed
我写了一个简短的bash脚本,它应该从字符串中去掉前导标签/空格:
#!/bin/bash
RGX='s/^[ \t]*//'
SED="sed '$RGX'"
echo " string" | $SED
它可以从命令行运行,但脚本会收到此错误:
sed: -e expression #1, char 1: unknown command: `''
我的猜测是引号有问题,但我不确定是什么。
确实如此。 尝试:
#!/bin/bash
RGX='s/^[ \t]*//'
#SED='$RGX'
echo " string" | sed "$RGX"
这有效。
你遇到的问题是引号和空格。 双引号字符串作为单个参数传递。
将set -x
添加到脚本中。 您将看到单引号内的变量未展开。
将命令放入变量并将它们完整地取出是很困难的,因为引用不按预期方式工作(参见BashFAQ#050,“我试图将命令放在变量中,但复杂的情况总是失败!” )。 有几种方法可以解决这个问题:
1)除非你真的需要,否则不要这样做。 说真的,除非你有充分的理由将命令放在变量中,否则执行它并不处理这种混乱。
2)除非你真的 真的需要,否则不要使用eval
。 eval
作为令人讨厌和模糊的错误的来源享有当之无愧的声誉。 如果你足够了解它们并采取必要的预防措施来避免它们,就可以避免它们,但这应该是最后的手段。
3)如果你真的必须在一个点定义一个命令并在以后使用它,要么将它定义为函数或数组。 以下是使用函数执行此操作的方法:
RGX='s/^[ \t]*//'
SEDCMD() { sed "$RGX"; }
echo " string" | SEDCMD
这是阵列版本:
RGX='s/^[ \t]*//'
SEDCMD=(sed "$RGX")
echo " string" | "${SEDCMD[@]}"
成语"${SEDCMD[@]}"
允许您扩展数组,将每个元素保持为单独的单词,而不会出现任何问题。
+要扩展我上面的评论:
#!/bin/bash
RGX='s/^[[:space:]]+//'
SED="sed -r '$RGX'"
eval "printf \" \tstring\n\" | $SED"
请注意,这也使得你的正则表达式是一个扩展的,没有特别的原因。 :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.