bash: заменить одинарную кавычку двумя кавычками в строке

Из справочной страницы дляstat(1)

-f, --file-system
display file system status instead of file status

Таким образом, чтобы получить свободные блоки файловой системы, в которой находится /tmp, вы можете попробовать что-то вроде

stat -f /tmp -c "%f"

Или, чтобы получить значение в октетах, умножьте свободные блоки на размер блока:

stat -f /tmp -c "%f*%S" | bc

5
28.08.2019, 14:05
2 ответа

Одно из изменений между bash -4.3 -alpha и предыдущей версией, выпуском bash -4.2 -:

When using the pattern substitution word expansion, bash now runs the replacement string through quote removal, since it allows quotes in that string to act as escape characters. This is not backwards compatible, so it can be disabled by setting the bash compatibility mode to 4.2.


Вход:

BASH_COMPAT=4.2
line="a'b"
echo "${line//\'/''}"

Выход:

a''b
7
27.01.2020, 20:34

Для метода, который будет работать независимо от версии (и реализации оболочки, такой как ksh93, откуда он исходит, и mksh и zsh, которые также его поддерживают ), вы можете сохранить шаблон и замену в переменной:

pattern="'"
replacement="''"
printf '%s\n' "${line//$pattern/$replacement}"

Или

q="'"
printf '%s\n' "${line//$q/$q$q}"

(обратите внимание, что в zsh$patternпринимается как фиксированная строка. Если вы хотите, чтобы он воспринимался как подстановочный шаблон (, который здесь не применяется, поскольку $patternне содержит подстановочных знаков ), вам необходимо заменить $patternна $~pattern. В других оболочках, если вы хотите, чтобы $patternвоспринималось как фиксированная строка, вам нужно заключить ее в кавычки (${line//"$pattern"/$replacement}).

5
27.01.2020, 20:34

Теги

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