while-loop - 在多个 shell 中使用 while read 循环保留反斜杠

标签 while-loop escaping sh portability backslash

我有以下代码:

#!/bin/sh
while read line; do
        printf "%s\n" $line
done < input.txt

Input.txt 包含以下几行:

one\two
eight\nine

输出如下

onetwo
eightnine

保留斜杠的“标准”解决方案是使用 read -r。 但是,我有以下限制:

  • 出于可移植性/posix 合规性的原因,必须在 #!/bin/sh 下运行。
  • 并非所有系统 将支持-r switch 在/sh下读取
  • 无法更改输入文件格式

因此,我正在寻找另一种在阅读该行后保留反斜杠的方法。我提出了一个可行的解决方案,即使用 sed\ 替换为其他值(例如 ||)临时文件(从而绕过我上面的最后一个要求),然后在读取它们之后再次使用 sed 将其转换回来。像这样:

#!/bin/sh
sed -e 's/[\/&]/||/g' input.txt > tempfile.txt
while read line; do
        printf "%s\n" $line | sed -e 's/||/\\/g'
done < tempfile.txt

我认为必须有一种更“优雅”的方式来做到这一点。 一些想法: 1)使用命令替换将其存储到变量而不是文件中。问题 - 我不确定命令替换是否可以在这里移植,我尝试使用变量而不是文件的尝试没有成功。无论文件还是变量,基本解决方案实际上是相同的(两个替换)。

2) 以某种方式使用 IFS?我进行了一些调查,但不确定这是否有助于解决此问题。

3) ???

鉴于我的限制,有什么更好的方法来处理这个问题?

谢谢

最佳答案

您的限制似乎有点严格。这是我记下的一段代码(我不太确定你的 while 循环对于你想做的其他事情有多大值(value),所以为了方便我删除了它)。我不保证这段代码是健壮的。但无论如何,该逻辑会给您提示您可能希望继续进行的方向。 (temp.dat 为输入文件)

#!/bin/sh
var1="$(cut -d\\ -f1 temp.dat)"
var2="$(cut -d\\ -f2 temp.dat)"

iter=1

set -- $var2
for x in $var1;do
    if [ "$iter" -eq 1 ];then
        echo $x "\\"  $1
    else
        echo $x "\\" $2
    fi
    iter=$((iter+1))
done

关于while-loop - 在多个 shell 中使用 while read 循环保留反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31634463/

相关文章:

c - 遍历数组 MIPS 程序集

c++ - 我的循环永远不会结束......我不明白为什么。有任何想法吗?

java - while循环初始化但不循环java

c++ - 如何在 C++ 字符串中存储 CTRL-A (0x01)?

php - 在 Laravel 中用引号转义字符串

javascript - JavaScript for 循环

php - 写入文件时停止 PHP 转义 JSON 字符串

linux - UNIX 从变量中删除字符

eclipse sh 编辑并运行

linux - sh/awk(部分)脚本返回空值但希望它返回一个值