我在文件夹中有很多txt文件,其中包含以这种格式的字符串:
asdasd:asdka
asdkasd:asda
asdk:asdasd
我想在:
char之前只取第一部分,并将其覆盖到相同的文本文件。我试过这个:
for i in *.txt; do cat i | cut -f1 -d":" > i.txt; done
但我收到了这个错误:
cat: i: No such file or directory
答案 0 :(得分:3)
最好将sed
与内联编辑结合使用:
for i in *.txt; do
sed -i.bak 's/:.*//' "$i"
done
:.*
会删除以:
开头的任何文字,而-i.bak
会将更改保存在原始文件中。
答案 1 :(得分:1)
您的错误是当您插入变量时变量需要一个美元符号。您还应该注意properly quote变量包含文件名的任何变量插值;否则,您的代码将使用空格等打破文件名。
for i in *.txt; do
cut -f1 -d":" "$i"> "$i".txt
done
我还拿出了useless cat
。
答案 2 :(得分:0)
您缺少$
变量名称中的i
前缀运算符。 $
给出变量的内容:
for i in *.txt; do cat "$i" | cut -f1 -d":" > "$i.txt"; done
注意引号。
这对cat
毫无用处,因为cut
是一个过滤程序。此外,$i
将包含 .txt
后缀。更糟糕的是,>
会在读取文件之前将原始文件截断为零字节!所以:
for i in *.txt
do
if cut -f1 -d":" "$i" > "$i.new"
then
mv "$i.new" "$i"
fi
done