【问题标题】:How do you stop sh from interpretting the '\' character? [duplicate]你如何阻止 sh 解释 '\' 字符? [复制]
【发布时间】:2019-10-31 19:14:22
【问题描述】:

`我有一个脚本,我试图从清单文件中读取,将该清单中的 DOS 路径转换为 ​​UNIX 路径,然后对这些文件进行操作。这是我正在尝试调试的一段 sn-p 代码:

while read line
do
    srcdir=$(printf '%s' "$line" | awk -F \\ -v OFS=/ '{ gsub(/\r|^[ \t]+|[ \t]+$/, "") } !NF { next } /^\\\\/ { sub(/^.*\\prj\\/, "\\prj\\") } { $1 = $1 } 1')
done < manifest.txt

我的输入文件如下所示:

$ cat manifest.txt
\\server\mount\directory

当我调试我的小 shell sn-p 时,我得到以下信息:

+ read line
++ printf %s '\servermountdirectory
'
++ awk -F '\' -v OFS=/ '{ gsub(/\r|^[ \t]+|[ \t]+$/, "") } !NF { next } /^\\\\/ { sub(/^.*\\prj\\/, "\\prj\\") } { $1 = $1 } 1'
+ srcdir=\servermountdirectory

所以...无论是在 read 还是在 printf,\ 字符都被解释为转义字符——我该如何解决这个问题?

注意...我知道我可以在 awk 中运行 while 循环...问题是在我的实际程序中,while 循环中还有其他内容需要使用"$srcdir" 完成——为此,sh 是正确的工具...所以我真的需要 sh 中的解决方案。

【问题讨论】:

  • 我认为这不完全是 [重复] - 因为在这种情况下,我不知道是 printf 还是读到这是问题所在,无法想办法告诉区别......但这是你的电话。 ;) 我真的很感激这里的答案。卡米尔很准确,艾伦也有一些好东西要补充。

标签: bash shell unix sh posix


【解决方案1】:

来自posix read

默认情况下,除非指定 -r 选项,否则 应充当转义字符。未转义的应保留后面字符的文字值,除外。如果 跟在 之后,读取实用程序应将其解释为行继续。在将输入拆分为字段之前,应删除 和 。将输入拆分为字段后,应删除所有其他未转义的 字符。

和:

-r
不要以任何特殊方式对待角色。将每个都视为输入行的一部分。

只是:

while read -r line; do

还请记住,如果没有 IFS=,这将不会保留尾随和前导空格。

请记住始终使用read -r。这是一个很好的阅读:bashfaq How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?

还要记住,在 bash 中逐行读取文件效率非常低。使用命令、工具、流和管道处理整个文件会更好。如果你必须逐行读取文件,让“预处理”阶段解析整个文件,然后逐行读取:

 awk .... manifest.txt |
 while read -r srcdir; do
    echo "$srcdir"
 done

或使用命令重定向,如果您需要循环在同一个 shell 中运行:

 while read -r srcdir; do
    echo "$srcdir"
 done  < <(awk ... manifest.txt)

【讨论】:

  • 我完全同意你的观点,但我们真的需要在处理之前阅读文件并将每一行打印到awk 吗?这就像做两倍的工作......无论如何+1
  • 感谢卡米尔——完美!
猜你喜欢
  • 2021-05-04
  • 2013-06-07
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2011-08-19
  • 1970-01-01
相关资源
最近更新 更多