【发布时间】:2012-07-20 16:27:27
【问题描述】:
在我的当前目录中,我有几个 .txt 文件。我想编写一个脚本来搜索这些 .txt 文件中的字符串,并删除包含该字符串的行。 例如,我想删除当前目录下所有 .txt 文件中所有带有“start”字样的行。
我已经写了以下代码,但是我不知道如何继续!
#!bin\bash
files=`find . -maxdepth 1 -name \*.txt`
我应该如何使用“while”来遍历每个文件?
【问题讨论】:
在我的当前目录中,我有几个 .txt 文件。我想编写一个脚本来搜索这些 .txt 文件中的字符串,并删除包含该字符串的行。 例如,我想删除当前目录下所有 .txt 文件中所有带有“start”字样的行。
我已经写了以下代码,但是我不知道如何继续!
#!bin\bash
files=`find . -maxdepth 1 -name \*.txt`
我应该如何使用“while”来遍历每个文件?
【问题讨论】:
在将find 的结果传递给它之后,您可以使用它along with read 依次获取每个文件名。然后您只需将文件名传递给sed 即可删除您感兴趣的行。
【讨论】:
简单易行:
sed -i "s/^.*string.*//" *.txt
这将删除每个 .txt 文件中包含“字符串”的任何行
【讨论】:
sed -i "s/string/d" *.txt 可以正常工作,不需要 -i 之后的额外 ""
当您在当前目录上使用-maxdepth 1 时,您不会递归到子目录。如果是这样的话,完全没有必要使用 find 来匹配带有扩展名的文件;你可以使用shell globs 来填充你的循环结构。例如:
#!/bin/bash
# Run sed on each file to delete the line.
for file in *txt; do
sed -i '/text to match/d' "$file"
done
这很简单,并且避免了在进程之间传递文件名参数时可能遇到的许多与文件名相关的问题。保持简单!
【讨论】: