【问题标题】:Could bash use non printing character as quote?bash 可以使用非打印字符作为引号吗?
【发布时间】:2013-07-05 04:12:33
【问题描述】:

这个问题源于一个用例,将"替换为'',latex quirk。

如果里面有"(双引号),我通常使用'(单引号)将脚本括起来,虎钳诗句。但是,在这种情况下,这个脚本中同时出现了单引号和双引号,我让谷歌找到了处理它的正确方法。这个one 提供了解决方案。以下是正确的,但不是很可读的解决方案。

sed 's!"!'\'''\''!' {filename}

在让它工作之后,我开始认为这种尴尬来自于这种引用机制。因此,是否可以使用非印刷字符作为报价单?那么,我们就不需要再转义引用了。

【问题讨论】:

  • 对于“正确”的一些定义:您缺少 s!!! 的结束分隔符
  • @glennjackman 不错的收获。固定。
  • 抱歉,我不明白这是怎么回事。 sed "s/\"/''/g" 有什么问题?它比你的要好得多,一旦你理解了双引号的工作原理,它就很自然了。
  • @gniourf_gniourf 酷!我什至没有意识到这可以这么简单。我回家后会测试它。同样,sed 's!"!\'\'!' 也应该能做到这一点,对吧?
  • @gniourf_gniourf 我的理解是错误的。我们不能直接在'' 中使用反斜杠来转义'。在关于 shell 编程的第一课中,我们被告知 '' 中的字符串是按字面解释的。

标签: bash printing quotes


【解决方案1】:

在 bash 中,你有单引号和双引号,还有 here-docs 和 here-strings:你可以这样做:

sed_script=$(cat << 'END'
s/"/''/g
END
)
sed "$sed_script" filename

【讨论】:

  • sed -f - filename &lt;&lt;'END' ... 'END' 也可以正常工作(直接从标准输入读取脚本,而不是将其填充到 shell 参数中)。
  • @chepner 我无法使用您的解决方案使其正常工作。 sed -f - &lt;filename&gt; &lt;&lt;'END' s!"!''! 'END'是我用的,bash认为是未终止的引用,当我点击Enter时提示/
  • 不要引用最后一个END。引用第一个END 赋予它神奇的力量。
  • 我到底为什么要引用结尾的END
  • @glennjackman @chepner 看来你们俩都能正常工作。倒霉的我。 sed -f - &lt;filename&gt; &lt;&lt;'END' s,",'', END 仍然无法正常工作,当我按 Enter 时留下/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2013-05-24
  • 2020-01-13
  • 2020-12-20
  • 2016-07-11
  • 1970-01-01
相关资源
最近更新 更多