Здесь нет оболочки sub -, а подстановка команд (на$(...)
). Если DBNAME
является переменной, вы можете использовать
DBNAME=mydatabase
mysqldump -u USERNAME -p "$DBNAME" > "$(date +"%F_%H-%M-%S")_$DBNAME.sql"
или даже
DBNAME=mydatabase
mysqldump -u USERNAME -p "$DBNAME" >"$(date +"%F_%H-%M-%S_$DBNAME.sql")"
или
DBNAME=mydatabase
outfilename=$(date +"%F_%H-%M-%S_$DBNAME.sql")
mysqldump -u USERNAME -p "$DBNAME" >"$outfilename"
или их варианты.
«Литерал
\n
— это , а не буквальный перевод строки.
Стандарт указывает, что в шаблоне поиска (BRE, базовом регулярном выражении, в POSIX -говорят )не может использоваться явный перевод строки, и что там новая строка представлена как '\n '; и его нельзя использовать в замене .
В вашем шаблоне поиска нет новых строк, явных или представленных символом '\n'. У вас есть '\n' в замене. Вышеупомянутое не говорит, как должен быть представлен (символ новой строки и вообще )в замещающем тексте. GNU sed воспринимает предыдущее как замену на '\n' означает введение новой строки. Разумный.
Флаг --posix
делает GNU sed
совместимым с POSIX.
POSIX оставляет поведение для s/x/\n/
неопределенным:
The meaning of an unescaped <backslash> immediately followed by any character other than '&', <backslash>, a digit, <newline>, or the delimiter character used for this command, is unspecified.
Таким образом, замена x
на n
, на \n
, на новую строку, сообщение об ошибке, перезагрузка компьютера — все это совместимое поведение. Нет никаких причин, по которым GNU sed
захотел бы изменить свое поведение там.
Соответствующее приложение(т.е. скрипт в таком случае )не должен использовать \n
там, именно об этом текст, который вы цитируете.
Это отличается от s/[\t]/x/g
, где POSIX требует замены как \
, так и t
на x
, и вы увидите, что поведение GNU sed
меняется с --posix
. Для s/[\n]/x/g
спецификация POSIX на самом деле неоднозначна. GNU sed
меняет свое поведение на --posix
, заменяя \
и n
на x
, но не так ясно, нужно это или нет.
Буквальный перевод строки и управляющая последовательность \n
— это разные вещи. Поскольку в команде, которую я представил в вопросе (printf '1X2' | sed --posix 's|X|\n|'
), нет буквального перехода на новую строку, в ней нет ничего противоречащего спецификации POSIX.
Цитата в вопросе говорит, что буквальный перевод строки не должен использоваться в замещающей функции (, которая является известной конструкцией s/BRE/replacement/flags
). Я полагаю, что спецификация означает, что
[Proposed correction of the original fragment] A literal newline shall not be used in the BRE of a context address or in the BRE of the substitute function.
Ведь фрагмент относится к разделу «Регулярные выражения в sed» спецификации POSIX.
В качестве дополнительного доказательства команда
sed --posix 's|X|\
|g' file
преуспеет в преобразовании символов «X» file
в новую строку. Обратите внимание, что новая строка находится в замещающей части команды , которая не является BRE .
На самом деле,в самой спецификации указано, что
A line can be split by substituting a newline into it. The application shall escape the newline in the replacement by preceding it by a backslash.