У меня есть ситуация, когда я хочу, чтобы bash-скрипт заменял всю строку в файле. Номер строки всегда одинаков, поэтому это может быть жестко заданная переменная.
Я не пытаюсь заменить некоторую подстроку в этой строке, я просто хочу полностью заменить эту строку новой строкой.
Существуют ли для этого методы bash (или что-то простое, что можно добавить в сценарий .sh).
sed: -e expression #1, char 26: unknown option to ``s'
и моя линия:sed -i '7s/.*/<param-value>http://localhost:8080/ASDF/services/REWS.REWSHttpSoap12Endpoint/</param-value>/' $TCE_SVN_HOME\trunk\tce\EWC\WebContent\WEB-INF\web.xml
. Любая идея?/
в тексте замены будет интерпретироваться как закрывающая косая чертаs
команды, если не экранирована (\/
). Однако проще всего выбрать в качестве разделителя другой, неиспользованный символ. Например,sed -i '7s{.*}{<param-value>http://...}' $TCE_SVN_HOME/trunk...
.s
определяет разделитель. Таким образом, чтобы изменить команду для использования, например,#
она будет выглядеть так:sed -i '7s#.*#<param-value>http://localhost:8080/ASDF/services/REWS.REWSHttpSoap12Endpoint/</param-value>#'
-e
if-i
; таким образом, правильная команда становится:sed -e 'Ns/.*/replacement-line/' -i '' file.txt
Я на самом деле использовал этот скрипт для замены строки кода в файле cron на серверах UNIX нашей компании некоторое время назад. Мы выполнили его как обычный сценарий оболочки и не имели проблем:
Это не относится к номеру строки, но вы можете легко переключиться на систему, основанную на номере строки, поставив номер строки перед
s/
и установив подстановочный знак вместоthe_original_line
.источник
sed -e "s/.../.../" /dir/file > /dir/temp_file
sed -e "s/.../.../" /dir/file > /dir/file
Предположим, вы хотите заменить строку 4 текстом «другой». Вы можете использовать AWK так:
AWK считает входные данные «записями», разделенными на «поля». По умолчанию одна строка - одна запись.
NR
количество увиденных записей.$0
представляет текущую полную запись (хотя$1
это первое поле в записи и т. д .; по умолчанию поля представляют собой слова из строки).Таким образом, если текущий номер строки равен 4, выведите строку «Другой», но в противном случае выведите строку без изменений.
В AWK код программы заключен в
{ }
запускается один раз для каждой входной записи.Вы должны заключить в кавычки программу AWK, чтобы оболочка не пыталась интерпретировать такие вещи, как
$0
.РЕДАКТИРОВАТЬ: более короткая и элегантная программа AWK от @chepner в комментариях ниже:
Только для записи (т. Е. Строки) номер 4, замените всю запись на строку «разные». Затем для каждой входной записи распечатайте запись.
Ясно, что мои навыки AWK ржавые! Спасибо, @chepner.
РЕДАКТИРОВАТЬ: и увидеть также еще более короткую версию от @Dennis Williamson:
Как это работает, объясняется в комментариях:
1
всегда оценивается как true, поэтому всегда выполняется связанный блок кода. Но нет никакого связанного блока кода, что означает, что AWK выполняет свое действие по умолчанию просто печати всей строки. AWK предназначен для кратких программ, подобных этой.источник
awk 'NR==4 {$0="different"} { print }' input_file.txt
.awk 'NR==4 {$0="different"}1' input_file.txt
1
? (Примечание: я проверил это, и оно действительно работает! Я просто не понимаю, как.)Учитывая этот тестовый файл (test.txt)
следующая команда заменит первую строку на «текст новой строки»
Результат:
Более подробную информацию можно найти здесь
http://www.thegeekstuff.com/2009/11/unix-sed-tutorial-append-insert-replace-and-count-file-lines/
источник
sed '1 cnewline text' test.txt
сделал бы это также.в bash замените N, M на номера строк и xxx yyy на то, что вы хотите
РЕДАКТИРОВАТЬ
На самом деле в этом решении есть некоторые проблемы, с символами "\ 0", "\ t" и "\"
"\ t", может быть решено путем помещения IFS = перед прочтением: "\", в конце строки с -r
но для "\ 0" переменная усекается, в чистом bash нет решения: присвоить строку, содержащую нулевой символ (\ 0), переменной в Bash Но в обычном текстовом файле нет нулевого символа \ 0
Perl будет лучшим выбором
источник
источник
Отличный ответ от Чепнера. Это работает для меня в Bash Shell.
здесь
index
- строка №newLine
- строка новой строки, которую мы хотим заменить.Аналогично приведенный ниже код используется для чтения определенной строки в файле. Это не повлияет на фактический файл.
здесь
!d
- удалит строки, отличные от строки no.$index
Таким образом, мы получим вывод в виде строки строки no$index
в файле.источник
${newline}
?На Mac я использовал
источник
Вы даже можете передать параметры в команду sed:
test.sh
orignial output.dat:
Выполнение ./test.sh дает новый output.dat
источник
line=5; sed -i "${line}s/.*/replaced by '$i'!/" output.dat