Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 取代#&引用&引用$&引用"E;%&引用&引用&&引用;,及_&引用;加上\#&引用&引用\$&引用"E;\%&引用&引用\&&引用;,及\_&引用;_Bash_Latex_Sed_Escaping_Grep - Fatal编程技术网

Bash 取代#&引用&引用$&引用"E;%&引用&引用&&引用;,及_&引用;加上\#&引用&引用\$&引用"E;\%&引用&引用\&&引用;,及\_&引用;

Bash 取代#&引用&引用$&引用"E;%&引用&引用&&引用;,及_&引用;加上\#&引用&引用\$&引用"E;\%&引用&引用\&&引用;,及\_&引用;,bash,latex,sed,escaping,grep,Bash,Latex,Sed,Escaping,Grep,我有一个纯文本文档,我想在LaTeX中编译它。但是,有时它有字符“#”、“$”、“%”、“&”和“#”。为了在LaTeX中正确编译,我必须首先将这些字符替换为“\”、“\$”、“\%”、“\&”和“\”。我在sed中使用了这一行: sed -i 's/\#/\\\#/g' ./file.txt sed -i 's/\$/\\\$/g' ./file.txt sed -i 's/\%/\\\%/g' ./file.txt sed -i 's/\&/\\\&/g' ./file.tx

我有一个纯文本文档,我想在LaTeX中编译它。但是,有时它有字符“#”、“$”、“%”、“&”和“#”。为了在LaTeX中正确编译,我必须首先将这些字符替换为“\”、“\$”、“\%”、“\&”和“\”。我在
sed
中使用了这一行:

sed -i 's/\#/\\\#/g' ./file.txt
sed -i 's/\$/\\\$/g' ./file.txt
sed -i 's/\%/\\\%/g' ./file.txt
sed -i 's/\&/\\\&/g' ./file.txt
sed -i 's/\_/\\\_/g' ./file.txt
sed -i -E 's/([#$%&_\])/\\&/g' file.txt
这是正确的吗

不幸的是,该文件太大,无法在任何GUI软件中打开,因此很难使用文本编辑器检查我的
sed
行是否正确。我尝试使用
grep
进行搜索,但搜索没有按预期进行(例如,在下面,我搜索了包含“$”的任何行):

  • 在这些字符前面放置“\”的最佳方式是什么
  • 如何使用
    grep
    成功检查替换行

    • 我认为您的问题在于bash本身正在处理这些越狱

    • 你所拥有的在我看来是正确的。但警告:它也将双重转义,例如,已转义的
      \\\
      。如果这不是您想要的,您可能需要修改您的模式,以检查是否已经存在前一个\项
    • $用于bash命令替换语法。我想
      grep“\\$”file.txt
      应该满足您的期望
    • 在大多数情况下,第一个(搜索)字符串上不需要
      \
      ,只需要
      $
      (这是一个特殊字符,表示行尾;其余字符并不特殊)。在替换中,您只需要两个
      \\
      ,而不是三个。此外,您还可以使用多个
      -e
      语句将所有这些功能集于一身:

      sed -i.bak -e 's/#/\\#/g'  \
                 -e 's/\$/\\$/g' \
                 -e 's/%/\\%/g'  \
                 -e 's/&/\\&/g'  \
                 -e 's/_/\\_/g' file.txt
      

      您不需要对任何内容进行双重转义(除了
      \\
      ),因为它们是单引号。在
      grep
      中,
      bash
      正在解释
      $
      上的转义,因为它是一个特殊字符(特别是变量的符号),所以
      grep
      只获取并搜索
      $
      ,这是一个特殊字符,表示行尾。您需要对其进行单引号引用以防止bash解释
      \
      '\$'
      ),或者添加另一对
      \\
      “\\$”。大概,这就是您从中获取
      \`的地方,但您不需要在编写的
      sed
      中使用它。

      您可以通过调用
      sed
      来进行替换:

      sed -i 's/\#/\\\#/g' ./file.txt
      sed -i 's/\$/\\\$/g' ./file.txt
      sed -i 's/\%/\\\%/g' ./file.txt
      sed -i 's/\&/\\\&/g' ./file.txt
      sed -i 's/\_/\\\_/g' ./file.txt
      
      sed -i -E 's/([#$%&_\])/\\&/g' file.txt
      

      替换文本中的
      &
      填充括号中的任何单个字符。请注意,由于
      \
      是LaTeX转义字符,因此您也必须在原始文件中转义它。

      我不响应
      sed
      ,其他答案很好;-)

      您可以使用
      less
      作为查看器查看您的大型文件(或
      more
      ,但
      less
      more
      更舒适)

      对于搜索,您可以使用
      fgrep
      :它忽略正则表达式=>
      fgrep'\$'
      将真正搜索文本
      \$
      fgrep
      与调用
      grep-F
      相同

      编辑:
      fgrep'\$”
      fgrep“\$”
      是不同的。在第二种情况下,
      bash
      解释字符串并将其替换为单个字符:
      $
      (即,
      fgrep
      将只搜索
      $

      您能保证没有任何已转义的特殊字符吗?如果不是预期的,grep如何工作?当我运行
      grep“\$”file.txt
      它似乎正在打印所有内容或几乎所有内容。我不知道它为什么要打印这么多文本,因为“$”非常罕见。我认为文档中不太可能已经有转义字符。“\”经常出现,但我不知道在什么情况下它会被用作转义字符。请尝试
      grep'\\\$'file.txt
      。如果您没有转义反斜杠(和美元符号),那么美元符号将转义,这将告诉
      grep
      查找一个文字“$”(而不是行尾-因为“$”在正则表达式中有特殊含义)。既然“$”是特殊的,它是否需要三个
      `(例如
      \\`)前面?@Village不在替换项中。不需要括号。某些版本的
      sed
      不支持
      -E
      ,而是使用
      -r
      。一些版本的
      sed
      需要在
      -i
      之后进行扩展,但由于OP没有在问题中提供扩展,因此可以安全地假设它不需要。所有这些都是好的。我想说的是-E将取决于使用中的sed版本,但必须从最终版本中删除它。实际上,您可能想将
      `更改为
      \textbackslash',因为“\`断线。