我希望能够只返回字符串中的转义文字,目前我正在这样做:
foo="\'\"\(foobar\)'another'[program]\[\$var\]()"
echo "${foo//[^\\\']/}"
但它输出:
\'\\''\\
所需的输出应该是这样的:
\'\"\(\)\[\$\]
我仍处于尝试获取文字单引号的阶段,但不知何故它不起作用,或者它在 bash 扩展中真的可行吗?
编辑
string 来自 bash $READLINE_LINE,因此不会像双引号的三重反斜杠那样进行额外的转义。
将变量设置为文字值
使用双引号字符串,您需要转义每个文字反斜杠和每个双引号或美元符号,否则会触发扩展。
如果使用单引号字符串,您只需要特别关心插入单引号:
在这里,我选择打破单引号字符串,为每个单引号添加一个双引号单引号,即
'"'"'
. 您也可以在单引号字符串之外使用转义单引号,即'\''
.如果引用变得太麻烦,您也可以选择使用引用的此处文档:
请注意,如果换行符是字符串中的最后一个字符,这将剪掉尾随的换行符。
然后,您的代码尝试删除所有反斜杠和单引号,这似乎不正确。相反,使用一些工具来提取
\
以下字符的所有实例:这产生
或者,
准确再现问题中的输出。
您也可以
bash
直接在循环中执行此操作:或者,
string
只要字符串中存在这样的字符序列,这就会通过将位修剪到反斜杠和其他字符的下一个匹配来修改值。在每次迭代中打印与给定正则表达式匹配的位。使用
zsh
而不是bash
,您可以执行以下操作:或与
ksh93
:(你认为
print -r -- "${foo//@(@(\\?)|?)/\2}"
应该也可以工作,但它没有,这看起来像一个错误)与
fish
:我不认为您可以使用模式替换操作来查找此类字符串,因为您需要查看前一个字符才能知道是否删除当前字符。你需要像 Perl 正则表达式的负面回顾来做到这一点。如果你考虑像这样的字符串,那就更难
\\x
了,第一个反斜杠应该转义第二个,但第二个不应该转义x
,至少在反斜杠转义通常起作用的范围内。在循环中找到匹配的部分会更容易,并不是说 Bash 真的很简单。(有正则表达式匹配运算符
[[ text =~ re ]]
,可以在 中找到匹配项${BASH_REMATCH[@]}
,但我认为除了手动之外没有其他方法可以循环多次命中。)但是你可以用 eg 来做到这一点
grep
。例如,这将输出匹配的序列,每行一个:然后将输出通过管道传输
tr -d '\n'
到以删除换行符。或者while IFS= read -r line; do...
,如果您需要在 shell 中处理它们,则使用,但如果您这样做,您可能应该使用其他工具;外壳不太适合文本处理。