什么是 ^I 字符,我如何使用 sed 找到它?

Ric*_*ron 5 text-editing vim sed escape-characters

我通常将数据从 csv 文件导入 MySQL,但我的数据提供程序将 NULL 条目保留为“”,因此我需要将“”替换为“\N”。这很容易使用类似的脚本

for csvfile in *.csv
do
    sed -i -e 's/^,/\\N,/' -e 's/,$/,\\N/' -e 's/,,/,\\N,/g' -e 's/,,/,\\N,/g' $csvfile
done
Run Code Online (Sandbox Code Playgroud)

但是,我有一个带逗号的 csv 文件,因此导入失败。我将文件设为“制表符分隔”并尝试

for txtfile in *.txt
do
    sed -i -e 's/^\\t/\\N\\t/' -e 's/\\t$/\\t\\N/' -e 's/\\t\\t/\\t\\N\\t/g' -e 's/\\t\\t/\\t\\N\\t/g' $txtfile
done
Run Code Online (Sandbox Code Playgroud)

但它仍然失败(据我所知,脚本没有添加任何“\N”)。当我在 Vim 中打开制表符分隔的文件并键入时,:set list它看起来像是制表符存储为“^I”。我尝试用“\^I”替换“\t”,但没有添加我需要的“\N”空字符。

有任何想法吗?谢谢!

sgm*_*ore 7

^ 通常是 Ctrl 的简写,Ctrl-I 与 Tab 相同


gar*_*ohn 2

您已经知道了 ^Is 是什么,但第二个sed命令失败的原因之一是您使用了错误的序列来匹配制表符。与制表符匹配的序列是\t, 不是\\t\\t匹配 a\后跟 a t