enter
заставляет линейную дисциплину терминального устройства отправлять текущий входной буфер плюс \n
(, переведенный из \r
, отправленный эмулятором терминала ()с помощью настройки icrnl
линейной дисциплины ), на приложение, которое читает с терминального устройства. ^D
заставляет линейную дисциплину терминального устройства отправлять текущий входной буфер без символа \n
или ^D
(символ съедается линейной дисциплиной, если только вы не отправили ^V
заранее ).
Двойное нажатие ^D
приводит к выходу cat
из-за предположения, что читать больше нечего.(read()
возвращает 0 байт ).
Я написал это в комментарии, потому что не понимал, что это уже решение. ОП написал, что это работает, так что на этот раз в качестве ответа:
sed "s/\(name=\"port\" *value=\"\)[0-9]*/\1$NEWPORT/g" config.xml
Регулярное выражение, предложенное OP, использовало несколько нестандартных расширений -, поэтому оно не работало с sed
, но они вам не нужны:
Я использую sed -i для замены значения порта в XML-файле,
Но я не знаю, как избежать регулярного выражения, мое регулярное выражение ниже.
(?<=somestring)
вы можете использовать строку как есть, но в \(somestring\)
пометить ее как подвыражение и повторно использовать в замене как \1
, поэтому вместо того, чтобы говорить «это нужно быть там, но не быть замененным», просто заменить его собой +
— это сокращение для\{1,\}
(одного или нескольких вхождений ), но вы также можете заменить a+
на aa*
. В этом случае, вероятно, лучше использовать простую *
, потому что нулевые вхождения невозможны \d
читается не лучше, чем [0-9]
,по-моему \s
можно заменить на [[:space:]]
или [ <literal tab>]
. Здесь работает простой пробел Заключение :Почти всех расширений reg -ex можно легко избежать, что может привести к немного длинному шаблону или трудностям для чтения, но часто без каких-либо недостатков. Исключением является не -жадное соответствие. :В некоторых случаях вам нужна другая концепция без них.