sed bash脚本意外地用空格而不是换行符替换字符

sed bash脚本意外地用空格而不是换行符替换字符

使用 bash 命令语法:

echo "The*quick*brown*fox"|sed s/*/\\n/g

我得到了所需的输出:

The
quick
brown
fox

然而在脚本中:

IN_TXT="The*quick*brown*fox"
OUT_TXT=$(echo $IN_TXT|sed s/*/\\n/g)
echo $OUT_TXT

我得到空白: The quick brown fox

我究竟做错了什么?

答案1

OUT_TXT当您将变量与 一起使用时,您没有引用该变量echo。这会导致 shell 将变量的值拆分为空格、制表符和换行符转换为单词,然后作为参数给出echo(另外进行文件名通配扩展之后)。 echo然后输出这些参数,参数之间有空格。

始终引用变量扩展:

echo "$OUT_TXT"

另请注意,您在echo $IN_TXT.如果变量的扩展IN_TXT未引用为"$IN_TXT",则其值将用作通配模式,并将替换为任何匹配的文件名(IN_TXT='*'例如,使用 进行测试)。

您的表达中也存在类似的问题sed,因为它没有正确引用。

也可以看看:

另外,您的sed命令最好按照sed 'y/*/\n/'标准sed编写不能使用s///命令插入换行符(GNUsed是一个例外)。命令sedy/// 知道如何将单个字符更改为换行符,无论sed使用什么实现。

或者,您可以简单地使用tr命令 as tr '*' '\n',或在 shell 中进行快速变量替换:

printf '%s\n' "${IN_TXT//\*/ }"

或者,

OUT_TXT=${IN_TXT//\*/ }
printf '%s\n' "$OUT_TXT"

相关内容