【发布时间】:2020-02-20 08:58:33
【问题描述】:
我有 csv 文件需要更改 f -> 0 和 t -> 1 仅在每个 csv 的逗号之间(如果匹配)。来自:
,t,t,f,f,a,t,f,t,f,f,t,f,
tftf
到:
,1,1,0,0,a,1,0,1,0,0,1,0,
tftf
以这种方式工作,但想知道可以减少更换时间消耗的更好方法
for i in 1 2 3 4 5 6
do
echo "converting tables for mariaDB"
find ./ -type f -name "*.csv" -print0 | xargs -0 sed -i 's/\,t\,/\,1\,/g'
find ./ -type f -name "*.csv" -print0 | xargs -0 sed -i 's/\,f\,/\,0\,/g'
echo "$i time(s) changed "
done
我除外,一个命令将改变行
【问题讨论】:
-
不确定你为什么在这里使用 for 循环。你不需要在 sed 命令中转义
,,你可以同时使用多个命令......而且你不需要xargs...如果您的find不支持+,请尝试find ./ -type f -name "*.csv" -exec sed -i 's/,t,/,1,/g; s/,f,/,0,/g' {} +使用\; -
我建议使用
sed两个循环:':1;s/,t,/,1,/g;t1; :2;s/,f,/,0,/g;t2' -
@Cyrus 哦,我现在明白了为什么 OP 使用了循环......很棒的观察
-
可以在这里使用
perl...perl -i -pe 's/,\Kt(?=,)/1/g; s/,\Kf(?=,)/0/g' -
可以肯定的是,只有逗号之间?像这样的行呢:
t,t,f?