在目录中搜索特定单词然后删除它

在目录中搜索特定单词然后删除它

我通过这个 shell 脚本指令在目录中搜索文本文件中的给定单词

 grep -r "$2" "$1"
  • $2是目录
  • $1是这个词

我怎样才能删除后面的这个词?

答案1

您可以使用gawk以下方法来执行此操作:

gawk -i inplace '{gsub("test", "");print}' file.txt

这里的“test”是您要删除的单词,file.txt 是您要编辑的文件。您已经使用 grep 找到了它,因此我不包括该部分。

我根据@Serg 的建议编辑了这篇文章

echo -n "Enter the path to directory (/path/to/dir), followed by [enter]:"
read dir_path

echo -n "Enter the word you are looking for, followed by [enter]:"
read word

cd ${dir_path}

for file in "$dir_path"/*txt; do
    echo $file

    awk -v var=$word -i inplace '{gsub(var, "");print}' $file
done

答案2

grep是线配套工具。它仅查找包含单词的行,并且不用于文本编辑/处理。

sed然而,这是正确的工具。通常,你会使用替换来删除一个单词,如下所示:

sed 's/word//g' text.txt

对于同一目录中的多个文件,可以使用通配符:

sed  's/word//g' *

-i对于实际更改文件来说,就地标志是必需的。

这是一个有效的例子:

$> echo "HELLO WORLD" | tee {one,two,three}.txt                                
HELLO WORLD
$> sed -i 's/WORLD//g' *                                                       
$> cat one.txt
HELLO 
$> cat two.txt                                                                 
HELLO 
$> 

这种方法的小缺点是,您要对所有正在搜索的文件执行操作。我们如何处理一个确切的文件?好吧,我们可以使用 来grep告诉我们具有wordwith-l选项的文件名,然后将其传递给sedusing xargs

这是一个工作示例。

$> echo "HELLO BEAUTIFUL WORLD" > one.txt                                      
$> grep -l 'BEAUTIFUL'  *  
one.txt
$> grep -l 'BEAUTIFUL'  * | xargs sed -i 's/WORLD//g'                          
$> cat one.txt
HELLO BEAUTIFUL 
$> 

相关内容