File 如何使用循环从.txt文件中删除行?

File 如何使用循环从.txt文件中删除行?,file,bash,loops,edit,File,Bash,Loops,Edit,在我当前的目录中,我有几个.txt文件。我想编写一个脚本来搜索那些.txt文件中的字符串,并删除包含该字符串的行。 例如,我想删除当前目录中所有.txt文件中有“开始”一词的所有行 我已经写了以下代码,但我不知道如何继续 #!bin\bash files=`find . -maxdepth 1 -name \*.txt` 如何使用“while”遍历每个文件?在将find的结果传送到文件后,您可以使用它依次获取每个文件名。然后您只需将文件名传递给sed即可删除感兴趣的行。Easy cheasy:

在我当前的目录中,我有几个.txt文件。我想编写一个脚本来搜索那些.txt文件中的字符串,并删除包含该字符串的行。 例如,我想删除当前目录中所有.txt文件中有“开始”一词的所有行

我已经写了以下代码,但我不知道如何继续

#!bin\bash
files=`find . -maxdepth 1 -name \*.txt`
如何使用“while”遍历每个文件?

在将
find
的结果传送到文件后,您可以使用它依次获取每个文件名。然后您只需将文件名传递给sed即可删除感兴趣的行。

Easy cheasy:
sed-i“s/^.*string.*/“*.txt
这将删除每个.txt文件中包含“string”的任何行

使用Globs填充循环变量 在当前目录上使用
-maxdepth 1
时,不会递归到子目录中。如果是这样的话,就根本不需要使用find来匹配具有扩展名的文件;您可以改为使用来填充循环构造。例如:

#!/bin/bash

# Run sed on each file to delete the line.
for file in *txt; do
    sed -i '/text to match/d' "$file"
done

这很简单,避免了在进程之间传递文件名参数时可能遇到的许多与文件名相关的问题。保持简单

你是说像这样的发现-maxdepth 1-name*.txt | read但如何到达读取的每个条目?请你再解释一下“我应该如何使用”而“浏览每个文件?”阅读链接。a.)我需要一个参数(用于备份扩展名),如果不需要备份,则为空,如-I“。b、 )s/*someting.*//不删除该行,仅将其替换为空行。因此,cheasy很简单,但不是您的解决方案,而是:sed-i”“/string/d”*。txt您确定替换而不是删除是正确的,但不确定-i选项的含义。如果-i为空,
sed-i“s/string/d”*.txt
工作正常,无需在gnu-sed上使用额外的“after”。便携式sed必须具有空字符串“”,以便在不备份的情况下进行简单覆盖…或者只需:sed-i'/text以匹配/d'*.txt(对于gnu sed)。或sed-i”“/text/d'*.txt用于便携式sed。对于递归(bash4)sed-i'/text/d'***.txt(KISS)