Используйте содержимое файла для замены строки с помощью SED - PullRequest
24 голосов
/ 22 июля 2011

Какой будет команда sed для сценариев оболочки Mac, которая заменит все итерации строки "fox" всем строковым содержимым myFile.txt.

myFile.txt будет html-содержимым с разрывами строк ивсевозможные персонажи.Примером может быть

    </div>
  </div>
  <br>
  <div id="container2">
    <div class="question" onclick="javascript:show('answer2')";>

Спасибо!

РЕДАКТИРОВАТЬ 1

Это мой фактический код:

sed -i.bkp  '/Q/{
s/Q//g
r /Users/ericbrotto/Desktop/question.txt
}' $file

Когда я запускаю его, я получаю:

sed in place editing only works for regular files. 

И в моих файлах Q заменяется на тонну китайских символов (!).Bizarre!

Ответы [ 2 ]

51 голосов
/ 22 июля 2011

Вы можете использовать команду r.Когда вы найдете «лису» во входных данных ...

/fox/{

... замените ее ни на что ...

    s/fox//g

... и прочитайте входной файл:

    r f.html
}

Если у вас есть файл, такой как:

$ cat file.txt
the
quick
brown
fox
jumps
over
the lazy dog
fox dog

, результат будет:

$ sed '/fox/{
    s/fox//g
    r f.html
}' file.txt
the
quick
brown

    </div>
  </div>
  <br>
  <div id="container2">
    <div class="question" onclick="javascript:show('answer2')";>
jumps
over
the lazy dog
 dog
    </div>
  </div>
  <br>
  <div id="container2">
    <div class="question" onclick="javascript:show('answer2')";>

РЕДАКТИРОВАТЬ : изменитьфайл обрабатывается, просто передайте флаг -i в sed:

sed -i '/fox/{
    s/fox//g
    r f.html
}' file.txt

Некоторые версии sed (например, моя собственная) требуют, чтобы вы передали расширение для флага -i, который будетрасширение файла резервной копии со старым содержимым файла:

sed -i.bkp '/fox/{
    s/fox//g
    r f.html
}' file.txt

А здесь то же самое, что и с одним вкладышем, который также совместим с Makefile

sed -i -e '/fox/{r f.html' -e 'd}'
7 голосов
/ 03 декабря 2015

В конечном итоге то, с чем я столкнулся, намного проще, чем множество решений, которые я нашел в Интернете:

str=xxxx
sed -e "/$str/r FileB" -e "/$str/d" FileA

Поддерживает шаблоны таким образом:

str=xxxx
sed -e "/$str/r $fileToInsert" -e "/$str/d" $fileToModify
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...