【问题标题】:Bash to comment a line in LaTeX .cls file with %, using sed commandBash 使用 sed 命令在 LaTeX .cls 文件中用 % 注释一行
【发布时间】:2019-04-12 13:02:48
【问题描述】:

我正在尝试使用带有 sed 的 bash 来替换它

    \printfield{year}%

通过这个

    %\printfield{year}%

行首有 4 个空格(虽然我不确定这是否重要)。基本上,这是一个LaTeX *.cls 文件,我需要注释掉每次出现的\printfield{year}%

我的尝试是基于this SO post

sed -i 's/\printfield{year}%/%\printfield{year}%/g' mydir/xxxxx.cls

但是它会产生这个输出

    \%printfield{year}%

% 符号的位置错误 - 它应该在行首(第一个字符),但它显示为第二个字符。我也试过sed -i "...".i.e.使用双引号,但它仍然给出与单引号相同的错误输出(上图)。

有没有办法通过在行的开头放置一个% 来注释掉这一行,在bash 中使用sed

系统信息

Ubuntu 18.10

【问题讨论】:

  • 你的 sed 两次都是一样的东西。
  • 道歉。刚刚更新了。我有...{year}%/\printfield{year}...,但应该是...{year}%/%\printfield{year}...

标签: bash sed replace


【解决方案1】:

反斜杠需要转义

$ sed 's/\\printfield{year}%/%&/g' file

请注意,您不必再次重复匹配的字符串,& 就是为此。

【讨论】:

  • 我什至没有查看原始字符串,认为问题与命令的那部分无关。谢谢!工作!感谢您对& 的解释 - 这是一个非常有用的快捷方式。
【解决方案2】:

\p

\ 是一个转义字符。为了打印\,您需要指定两次。 \p 转义为 p 并且 \ 被忽略。使用:

sed 's/\\printfield{year}%/%\\printfield{year}%/g'

【讨论】:

    【解决方案3】:

    这是因为 bash 将 \ 字符解释为转义字符,因此在您的 sed 命令中

    sed -i 's/\printfield{year}%/%\printfield{year}%/g' mydir/xxxxx.cls
    

    它试图用另一个命令替换转义的“p”打印字段,以绕过这个转义你的\ 与另一个\

    所以

    sed -i 's/\\printfield{year}%/%\\printfield{year}%/g' mydir/xxxxx.cls
    

    【讨论】:

    • 很好的解释。谢谢。我在想我必须逃离%,所以我尝试了它,但它没有用。我什至不认为我必须逃避\ ....这是我错过的关键点。
    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多