GNU sed --posix и символ новой строки в замещающей строке

Здесь нет оболочки 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"

или их варианты.

0
08.03.2020, 18:10
4 ответа

«Литерал не должен использоваться», В вашем примере не используется буквальная новая строка. Поэтому эта часть стандарта не актуальна.

\n— это , а не буквальный перевод строки.

2
28.04.2021, 23:21

Стандарт указывает, что в шаблоне поиска (BRE, базовом регулярном выражении, в POSIX -говорят )не может использоваться явный перевод строки, и что там новая строка представлена ​​как '\n '; и его нельзя использовать в замене .

В вашем шаблоне поиска нет новых строк, явных или представленных символом '\n'. У вас есть '\n' в замене. Вышеупомянутое не говорит, как должен быть представлен (символ новой строки и вообще )в замещающем тексте. GNU sed воспринимает предыдущее как замену на '\n' означает введение новой строки. Разумный.

1
28.04.2021, 23:21

Флаг --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, но не так ясно, нужно это или нет.

2
28.04.2021, 23:21

Буквальный перевод строки и управляющая последовательность \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.

1
28.04.2021, 23:21

Теги

Похожие вопросы