我通过这个 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
告诉我们具有word
with-l
选项的文件名,然后将其传递给sed
using 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
$>