gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:54:10 27 4
gpt4 key购买 nike

我有以下代码:

#!/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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com