Как удалить известную последнюю часть из строки вывода команд в одну строку?

Перефразируя: я хочу использовать подстановку команд Bash и подстановку строк в одной строке.

Мои настоящие команды длиннее, но нелепое использование эха здесь просто «замена» краткости и действует так же - с теми же ошибками;)

Я знаю, что мы можем использовать команду Bash для создания выходной строки в качестве параметра для другой команды, например:

echo "$(echo "aahahah</ddd>")"
aahahah</ddd>

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

var="aahahah</ddd>"; echo "${var%</ddd>}"
aahahah

Я пытаюсь написать команду, в которой одна команда дает строковый вывод, где я хочу удалить последнюю известную часть.

echo "${$(echo "aahahah</ddd>")%</ddd>}"
-bash: ${$(echo "aahahah</ddd>")%</ddd>}: bad substitution

Это может быть порядок вещей или замена работает только с переменными или жестко закодированными строками. Но я подозреваю, что просто я что-то упускаю, и это возможно.

Как заставить это работать? Почему это не работает?


person uldics    schedule 21.02.2020    source источник
comment
Я не думаю, что можно комбинировать подстановку команд и подстановку строк, как вы хотите. Если вы решили использовать однострочник, вы можете использовать sed вместо замены строки: echo "$(echo 'aahahah</ddd>' | sed 's:</ddd>$::')".   -  person pjh    schedule 21.02.2020


Ответы (2)


Когда используется знак доллара, как в $word или эквивалентном ${word}, он запрашивает содержимое word. Это называется расширением параметра согласно man bash.

Вы можете написать var="aahahah</ddd>"; echo "${var%</ddd>}": Это расширяет var и выполняет специальную операцию суффикса перед возвратом значения.

Однако вы не можете писать echo "${$(echo "aahahah</ddd>")%</ddd>}", потому что после оценки $(echo "aahahah</ddd>") нечего расширять.

От man bash (курсив мой):

${параметр%слово}

Удалить соответствующий шаблон суффикса. Слово расширяется для создания шаблона, как и при расширении имени пути. Если шаблон соответствует конечной части расширенного значения параметра, то результатом расширения является расширенное значение параметра с самым коротким совпадающим шаблоном (случай ''%'') или самым длинным соответствующий шаблон (случай ''%%'') удален.

person Quasímodo    schedule 21.02.2020

Объедините ваши команды, как это

var=$(echo "aahahah</ddd>")
echo ${var/'</ddd>'}
person Ivan    schedule 21.02.2020
comment
Спасибо. Да, это работает, замена содержимого переменных ничем, но мне кажется, что это отказ от мечты об одном вкладыше: D - person uldics; 21.02.2020