对文件夹中的每个txt文件执行cut命令

时间:2016-03-18 16:24:41

标签: bash

我在文件夹中有很多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

3 个答案:

答案 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