代码之家  ›  专栏  ›  技术社区  ›  Imran Hemani

替换特殊字符

  •  0
  • Imran Hemani  · 技术社区  · 7 年前

    .txt 文件。

    我想取代那个特殊的角色 ý | 并将文件重命名为 .mnt .txt文件

    这是我的代码:它将文件重命名为

    #!/bin/sh
    for i in `ls *.txt 2>/dev/null`;
    do
    filename=`echo "$i" | cut -d'.' -f1`
    sed -i 's/\ý/\|/g' $i
    mv $i ${filename}.mnt
    done
    

    怎么做?

    例子:

    BEGIN_RUN_SQLýDELETE FROM PRC_DEAL_TRIG WHERE DEAL_ID = '1:2:1212'
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   tripleee    7 年前

    您的代码中有多个问题。 Don't use ls in scripts quote your variables. 你应该用 $(command substitution) 而不是遗产 `command substitution`

    ý 在文件的内容中--而不是在其名称中-- sed -i 不是错误的,而是多余的;只需将更新的内容写入新的位置并删除旧文件。

    #!/bin/sh
    for i in *.txt
    do
        filename=$(echo "$i" | cut -d'.' -f1)
        sed 's/ý/|/g' "$i" >"${filename}.mnt" && rm "$i"
    done
    

    如果您的系统配置为UTF-8,则字符 可以用字节序列表示 \xc3 \xbd (代表 U+00FD )或者分解序列 \0x79 \xcc \x81 ( U+0079 U+0301 )-您可能会发现文件包含一种表示法,而您的终端倾向于另一种表示法。唯一确定的方法是检查文件和终端上的十六进制字节。您的终端也完全有可能无法准确显示文件的内容。尝试

    bash$ printf 'ý' | xxd
    00000000: c3bd
    
    bash$ head -c 16 file | xxd
    00000000: 4245 4749 4e5f 5255 4e5f 5351 4cff 4445  BEGIN_RUN_SQL.DE
    

    如果(如这里)您发现它们不同(后者输出单字节 \xff 在“BEGIN-RUN-SQL”和“DE”)之间,那么琐碎的方法就行不通了。你的 sed 确切地