我在编写脚本时遇到了一个大问题:基本上,我从文件中读取了一行。 所有行都是由3到8个字符连续组成(没有空格)。 然后我使用sed替换模式中的那些行(在我下面的最小脚本中也称为“var”)
var="iao"
for m in `more meshing/junction_names.txt`
do
echo $m
echo -n $m | xxd -ps | sed 's/[[:xdigit:]]\{2\}/\\x&/g'
echo $var |sed "s/a/b/"
echo $var |sed "s/a/$m/"
done
现在这些是我输出的第3条记录(无论如何它们都是一样的)。 我正在使用linux。根据凯特的说法,所有文件都是UTF-8编码的。很奇怪吧?任何想法都是受欢迎的。
J_LEAK
\x4a\x5f\x4c\x45\x41\x4b\x0d
ibo
oJ_LEAK
JO_1
\x4a\x4f\x5f\x31\x0d
ibo
oJO_1
JPL2_F
\x4a\x50\x4c\x32\x5f\x46\x0d
ibo
oJPL2_F
JF_PL2
答案 0 :(得分:0)
您的输入文件包含DOS回车符(或者可能是用more
读取它的荒谬尝试引入它们)。十六进制转储显示清楚;每个值以\x0d
结尾,转换为控制代码,使终端将光标跳回到行的开头。
这是一个庞大的常见问题解答,您可以找到许多有关如何解决此基本问题的示例,包括bash tag wiki。
切向,除非您特别要求shell对值执行通配符扩展和空白标记化,否则应始终引用字符串;而Bash有内置插件来避免不优雅且容易出错的echo | sed
。最后,don't read lines with for
。
var="iao"
tr -d '\015' <meshing/junction_names.txt |
while read -r m; do # don't use a for loop
echo "$m" # quote!
echo -n "$m" | xxd -ps | sed 's/[[:xdigit:]]\{2\}/\\x&/g'
echo "${var/a/b}" # quote; use Bash built-in substitution mechanism
echo "${var/a/$m}"
done
也许你想一劳永逸地删除回车符,然后只使用while read .... done <fixed-file
而不是tr
管道。