Я ищу в каталоге пообещанный в текстовых файлах этой инструкцией по сценарию оболочки
grep -r "$2" "$1"
$2
каталог $1
словоКак я могу удалить это слово после него?
Можно использовать gawk
, чтобы сделать это:
gawk -i inplace '{gsub("test", "");print}' file.txt
Здесь "тест" является словом, которое Вы пытаетесь удалить, и 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
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
с -l
опция, и затем передает его на sed
использование 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
$>