2012-06-22 9 views
3

У меня есть следующая проблема.найти и заменить sed

У меня есть файл с большим количеством слов внутри того, что мне нужно сделать, это найти эти слова в другом файле и заменить их только одной буквой.

Я не знаю слова, которые я должен удалить (слишком много!), Поэтому я не знаю, как использовать следующую команду патч в

$ sed -i 's/words_old/word_new/g' /home/user/test.txt 

однако я думаю, что я должен использовать также кошку команда:

$ cat filewithwordstobedeleted.txt 

но я не знаю, как их объединить.

Спасибо, что помогли мне! :)

Фабио

+0

Где сделайте word_new взялось? Являются ли они также указаны в файлеwithwordstobedeleted.txt, рядом с каждым словом, или вы заменяете все слова одной буквой? –

+0

Я должен заменить все слова словом «null» – fabioln79

+1

Остерегайтесь ошибки [clbuttic] (http://thedailywtf.com/Articles/The-Clbuttic-Mistake-.aspx). –

ответ

3

Простая петля оболочка может помочь вам в этом, если у вас есть одно слово, чтобы быть удалены в строке:

cat filewithwordstobedeleted.txt | while read word; do 
    sed -i "s/$word/null/g" /home/user/test.txt 
done 

Обратите внимание, что использование cat не является строго необходимо, но этот пример легче читать.

+1

Для любопытной альтернативой без кошки является 'while read word; делать ...; done chepner

+0

Это было также мое предложение. Мне было интересно, однако, если бы это было медленнее, из-за множественных вызовов sed, чем если бы вы могли каким-то образом сделать это с помощью одного sed? –

+0

Я пробовал, но это работает странным образом, возможно, из-за того, что у меня нет ни одного слова в строке. Поэтому вместо замены каждого слова «null» помещается «null» в каждую строку. Он должен работать таким образом: оранжевое яблоко ананаса (то же самое) -> null null null или orangepineappleapple -> nullnullnull – fabioln79

0

Если список слов один за построчно и не смешно долго:

sed -ri "s/$(tr "\n" "|" < filewithwordstobedeleted.txt | head -c-1)/null/g" /home/user/test.txt 
+0

нет, к сожалению, это не список слов, а серия слов в одной строке: оранжевый ананас яблоко (той же строки), что я хотел бы иметь как null null null или orangepineappleapple -> nullnullnull. Да, это смешно долго, но время не проблема. Я могу оставить его на сервере без каких-либо проблем. – fabioln79

+0

@ fabioln79: Я имею в виду, если список слов, которые нужно удалить (filewithwordstobedeleted.txt), равен одному в строке. Моя команда работает, если файл для изменения имеет несколько слов в строке. Длина не относится к времени выполнения, но превышает ли она пропускную способность командной строки для вашей системы (2 МБ в моей системе). –

0

Это может работать для вас (GNU СЭД):

# cat <<\! >/tmp/a 
> this 
> that 
> those 
> ! 
cat <<\! >/tmp/b 
> a 
> those 
> b 
> this 
> c 
> that 
> d 
> ! 
sed 's|.*|s/&/null/g|' /tmp/a 
s/this/null/g 
s/that/null/g 
s/those/null/g 
sed 's|.*|s/&/null/g|' /tmp/a | sed -f - /tmp/b 
a 
null 
b 
null 
c 
null 
d 
cat <<\! >/tmp/c 
> a 
> this and that and those 
> b 
> this and that 
> c 
> those 
> ! 
sed 's|.*|s/&/null/g|' /tmp/a | sed -f - /tmp/c 
a 
null and null and null 
b 
null and null 
c 
null 
Смежные вопросы