О каком терминале шпаклевка сообщает Вашим полям Linux? echo $TERM
узнать. Вы могли бы попытаться установить это для xterm-окрашивания (может быть установлен в putty
конфигурации сессии) для лучших результатов. Несколько символов и проблем поведения разглажены, когда они думают, что у Вас есть способный терминал.
Строго говоря, спецификация POSIX для sed
требует новой строки после a\
:
[1addr]a\ text
Запишите текст в стандартный вывод, как описано ранее.
Это делает остроты записи чем-то вроде боли, которая является, вероятно, причиной следующего расширения GNU a
, i
, и c
команды:
Как расширение GNU, если между
a
и новая строка там отличается от пробела -\
последовательность, затем текст этой строки, запускающейся в первом непробельном символе послеa
, взят в качестве первой строки текстового блока. (Это включает упрощение в сценариях короткого, добавляют.) Это расширение также работает сi
иc
команды.
Таким образом, чтобы быть портативным с Вашим sed
синтаксис, необходимо будет включать новую строку после a\
так или иначе. Самый легкий путь состоит в том, чтобы просто вставить заключенную в кавычки новую строку:
$ sed -e 'a\
> text'
(где $
и >
приглашения оболочки). Если Вы находите что боль, bash
[1] имеет $' '
при заключении в кавычки синтаксиса для вставки Escape C-стиля поэтому просто используйте
sed -e 'a\'$'\n''text'
[1] и mksh (r39b +) и некоторые оболочки Bourne неудара (например,/bin/sh в FreeBSD 9 +)
Как описано в этом ответе, это полезно при использовании sed команд как i
и a
использовать несколько -e "..."
пункты. Каждый из этих пунктов, как будут понимать, будет разделен новыми строками. i
и a
команды трудно использовать во встроенных sed сценариях иначе (они разработаны для использования в мультилинии sed, файл сценария вызвал использование sed -f file ...
). Похоже, что Вы не можете использовать неявную новую строку, представленную к концу -e
пункт для разделения a\
и строка текста это должно быть добавлено. Но можно использовать его для завершения строки текста, это должно быть добавлено.
В этом конкретном случае, что Вы пытаетесь сделать, мог бы на самом деле быть выполнен с синглом -e ...
пункт. Просто необходимо использовать a
управляйте правильно. По стандарту POSIX, a
потребности, которые будут сопровождаться a \
, затем это должно сопровождаться новой строкой, затем остаток от следующей строки будет вставлен (пока новая строка или конец -e
с пунктом встречаются). Таким образом, Вы могли сделать:
sed -i "" -e $'4 a\\\n'"mode '0755'" file.txt
GNU sed, кажется, является намного более наиболее часто используемым, чем POSIX sed, на основе примеров/учебных руководств, которые я использовал так или иначе.
Я нашел, что намного легче только установить GNU sed на любой машине OSX, которую я использую. Если Вам интересно, лучший способ сделать, это - установка он через Домашнее пиво.
Вы можете любой просто $ brew install gnu-sed
, или получите все общие утилиты GNU с $ brew install coreutils
.
Затем, когда Вы сталкиваетесь с проблемой синтаксиса с date
или некоторая другая программа можно просто использовать версию GNU. В конечном счете я просто решил, что было легче всегда использовать версии GNU и поместить их ранее, чем версии системы в моем PATH
.
Perl не переносит от такого зависимого платформы GNU по сравнению с не-GNU по сравнению с "собственными" особенностями. Вы могли сделать:
perl -ni.old -e 'print;if ($.==4) {print "mode 0755\n"}' file
-n' option creates a loop that reads every line of the input file. Unlike its cousin
- p(not used here) it doesn't automatically print every line read. The
- яinvokes in-place replacement. The argument to
- я(viz. ".old") can be dropped or changed. It leaves a backup of the unmodified file. The -e
сигнализирует о начале сценария.
$.
обозначает номер строки, начинаясь со строки 1. Таким образом командная строка читает 'файл' и когда номер строки равняется 4, это печатает ту строку, сопровождаемую тем, что Вы хотите ввести.
Я спешил бы добавлять, что Perl должен свои корни sed
, AWK и C, таким образом, синтаксис для простых замен, и т.д. не очень крутая кривая обучения.
Простая демонстрация:
$ date | sed -E $'1i\\\nfoo\n'
foo
Thu Aug 6 07:09:01 CDT 2020
$'...'
— это башизм для принудительного развертывания управляющей последовательности. При его использовании вы должны использовать \\
, чтобы получить литерал \
в строке.