У меня есть два разных файла:
File1
/home/user1/
/home/user2/bin
/home/user1/a/b/c
File2
<TEXT1>
<TEXT2>
Я хочу , чтобы заменить <TEXT1>
из Файл2 с содержанием File1 использования sed
. Я попробовал эту команду, но не получил правильный вывод:
cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"
Вы можете использовать другие инструменты, чтобы решить эту проблему.
sed
реализацию вы используете. You код работает для меня с GNUsed
./home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>
. Не получаю новых строк.diff
иpatch
инструменты позволяют довольно легко заменить некоторые строки в файле другими линиями.$()
помощью сценария Sed, заставляет мои глаза кровоточить. Никогда не используйте внешние данные в местах, где некоторые символы интерпретируются с особым значением.Ответы:
Вот решение для сценария sed (на первый взгляд проще, чем попытаться поместить его в одну строку в командной строке):
Запуск это:
источник
sed '/<TEXT1>/{rFile1^Md^M}' File2
где "^ M" вы нажимаете клавишу возврата. Проблема в том, что sed действительно нужны символы новой строки в {...} для разделения команд r и d.sed $'/<TEXT1>/ {r File1\n d}'
sed -e '/<TEXT1>/{r File1' -e 'd}' File2
<TEXT1>
я, я просто хочу заменить саму строку, оставив остальную часть строки нетронутой?Text1: <TEXT1>
кText1: <file_contents>
.Мне потребовалось много времени, чтобы найти это решение с помощью замены var. Все решения Sed у меня не сработали, так как они либо удаляют полные строки, либо заменяют неправильно.
Заменяет все вхождения TEXT1 в file2 против содержимого file1. Весь остальной текст остается нетронутым.
источник
sed
тоже, так как эти «расширения» (или замены) встроены в оболочку (bash
по крайней мере)Я отвечаю, потому что метод
diff
/patch
может быть интересен в некоторых случаях. Чтобы определить замену строк, содержащихся в файлеblob1
, строками, содержащимися вblob2
использовании:Например, если
blob1
содержит:и
blob2
содержит:сгенерированный
patch-file
будет:Теперь вы можете применить этот патч к любому другому файлу:
Он заменит
hello
,you
линии отbe
,welcome
,here
линии вsomefile
.источник