2015-06-22 3 views
1

Десять файлов, расположенных в каталоге. Каждое содержимое файла имеет слово «яблоко». напишите сценарий оболочки bash, чтобы заменить «apple» на «banana» во всех десяти файлах и напечатать количество замен для каждого файла. Попробовали таким образом, но не знаете, как получить номер замены. может ли кто-нибудь помочь в этом? и СЭД только изменение в дисплее фактического файла не получает модифицированныйсценарий оболочки для подсчета заметок

#!/bin/bash 
for f in *.txt 
do sed 's/apple/banana/g' $f 
done 
+3

Когда вы говорите «сценарий оболочки», вы имеете в виду bash, ksh, что-нибудь еще? Возможно, добавьте соответствующие теги. Также, какова реальная проблема, которую вы пытаетесь решить? Какой-то контекст может быть приятным, поскольку это звучит как домашнее задание. – wmorrison365

+0

Не используйте код в комментариях. Вместо этого отредактируйте свой вопрос, показывая это. – fedorqui

+0

См. Также вопрос [как-check-if-the-sed-command-replace-some-string] (http://stackoverflow.com/questions/15433058/how-to-check-if-the-sed- command-replace-some-string) – wmorrison365

ответ

1

Предполагая, что вы хотите заменить слово «яблоко» с «бананом» (точное совпадение) в содержания файлов, а не на имена файлов (см мой комментарий выше), и что вы используете bash оболочки:

#!/bin/bash 

COUNTER=0 

    for file in *.txt ; do 
     COUNTER=$(grep -o "\<apple\>" $file | wc -l) 
     sed -i 's/\<apple\>/banana/g' $file 
     echo "RESULT: $COUNTER replacements in file $file" 
     let COUNTER=0 
    done 

exit 0; 

Объяснение:

  • Чтобы подсчитать замену для каждого файла, вы можете использовать grep с флагом -o, чтобы распечатать все совпадения со словом, которое вы хотите заменить (каждое в новой строке), и передать результат на wc -l (что считается символом перевода строки). Результат сохраняется в переменной, которая печатается на экране, а затем сбрасывается после обработки каждого файла.
  • Вы должны указать флаг -i, если вы хотите, чтобы sed фактически выполнял подстановку в файлах, в противном случае подстановка будет выполняться на стандартном выходе.
  • Этот скрипт заменит только точные соответствия слова «яблоко». Таким образом, слово «яблоки», например, будет не заменить на «бананы». Если вы хотите другое поведение, просто удалите слово delimiters вокруг слова «apple» (разделители слов: \< и \>).
+0

Да Это сработало. спасибо за ваш ответ ... – Bubbles

+0

Любые ссылки, предлагаемые для упражнений на командах «sed» и «awk», пожалуйста, разместите ссылки – Bubbles

+1

@Bubbles. Если это сработало для вас, пожалуйста, подтвердите его и примите его, щелкнув галочку слева. Что касается практических команд «sed» и «awk», это лучшие уроки и лучшие рекомендации, которые я мог бы найти в стороне от самой документации: http://www.grymoire.com/Unix/Sed.html http://www.grymoire.com/Unix/Awk.html – Frank

Смежные вопросы