Я написал это в комментарии, потому что не понимал, что это уже решение. ОП написал, что это работает, так что на этот раз в качестве ответа:
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 можно легко избежать, что может привести к немного длинному шаблону или трудностям для чтения, но часто без каких-либо недостатков. Исключением является не -жадное соответствие. :В некоторых случаях вам нужна другая концепция без них.
Здесь есть две части, и, насколько мне известно, нет ни одного инструмента, который бы выполнял и то, и другое:
Что делало командование?
С такой командой, как rm
, это обычно довольно очевидно, но другие команды имеют довольно плохой вывод, и они на самом деле не сообщают вам, с чем была связана ошибка отказа в доступе.
Команда strace очень полезна для этого. В нем перечислены все системные вызовы и сигналы, полученные процессом. Полезно, что он декодирует часть этой информации в удобочитаемый вывод.
По умолчанию все записывается в stderr, но его можно настроить для записи в файл с помощью переключателя -o
.
Приведу простой пример. Мы можем настроить тривиальный случай, чтобы заставить rm
потерпеть неудачу с этим:
$ sudo mkdir foo
$ sudo touch foo/bar
$ rm -rf foo
rm: cannot remove 'foo/bar': Permission denied
Чтобы показать, как может помочь strace, запустим ту же команду rm
:
$ strace -o trace_file rm -rf foo
$ grep EACCES trace_file
unlinkat(4, "bar", 0) = -1 EACCES (Permission denied)
Таким образом, это показывает, что вызов unlinkat не смог удалить файл bar
из уже открытого каталога.
Хотя мы уже знали, что так будет, мы настроили его на провал. Это может быть полезно для диагностики более сложных команд с более плохим выводом.
Я не знаю инструмента, который бы определял, почему что-то привело к ошибке отказа в доступе, однако причин относительно немного.
Права доступа к файлам являются наиболее распространенными.T они хорошо задокументированы , поэтому не стоит их здесь перечислять.
Два других источника, которые могут регулярно выявлять людей::
Нет особого смысла проверять это на основе команды, потому что вы должны знать, что команда собирается сделать:
Разрешения не имеют значения, какая программа пытается выполнить эти операции. Одна и та же команда может делать разные вещи в зависимости от ее аргументов или среды.