使用sed非常奇怪的行为

时间:2015-04-08 10:42:14

标签: bash replace sed character-encoding

我在编写脚本时遇到了一个大问题:基本上,我从文件中读取了一行。 所有行都是由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

1 个答案:

答案 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管道。