Что касается приведенных выше примеров ввода, сценарий может быть следующим:
sed s/[^\"\']*[^0-9]\]{\(.*\)}/\1/ <<\END
"[]{foo bar 1}"
"[abc]{foo bar 2}"
"[]{foo[3]{xyz} bar 3}"
"[]{foo $sq[3]{xyz}$ bar 4}"
"[goo{w}]{foo $sq[3]{xyz}$ bar 5}"
"[goo[3]{w}]{foo $sq[3]{xyz}$ bar 6}"
"[goo[3]{w} hoo[3]{5}]{foo $sq[3]{xyz}$ bar 7}"
END
производит
"foo bar 1"
"foo bar 2"
"foo[3]{xyz} bar 3"
"foo $sq[3]{xyz}$ bar 4"
"foo $sq[3]{xyz}$ bar 5"
"foo $sq[3]{xyz}$ bar 6"
"foo $sq[3]{xyz}$ bar 7"
Другая вещь - ваша функция, которую можно упростить:
function RemoveInitialSquareBraces {
printf '%s\n' "$@" |
sed ...
}
, таким образом, она будет принимать множество аргументов.
Обновление : в более общем случае вы можете выполнить задачу в два этапа:
sed -e "
s/\[.*\[.*\][^[]*\]/[]/ #remove square brackets inside square brackets
s/\[[^]]*\]{\(.*\)\}/\1/ #lazy strip square brackets and curle brackets
"
Дополнение : вы можете использовать perl- grep (GNU grep с расширением perl):
grep -Po '\[([^][]*\[\w+\][^][]*)*\]{\K.*(?=})'
или sed с тем же регулярным выражением:
sed 's/\[\([^][]*\(\[\w\+\][^][]*\)*\)*\]{\(.*\)}/\3/'
Я не уверен, правильно ли я понимаю, но это случай, когда "ctrl+C" завершает текущую программу, возвращая вас в приглашение оболочки ($ )?
Gimp (и другие )завершатся нажатием Ctrl -C.
Если вы хотите восстановить командную строку, вы также можете использовать Ctrl -Z, которая останавливает текущий процесс (, но не завершает его )и возвращает в командную строку.
bg
. fg
Для более отказоустойчивых процессов вы можете открыть другой терминал (или вкладку )и использовать pkill {processname}
, например pkill gimp
. Обратите внимание, что аргумент является шаблоном регулярного выражения (, так что, например, gimp
может другой процесс с gimp
в его имени ), поэтому используйте его с осторожностью. Обычно ни один процесс не может противостоять опции -9
, поэтому используйте ее с особой осторожностью.
Для приложений с графическим интерфейсом есть другой метод :удар Alt-Ctrl-Escape:курсор изменится на череп и кости, наведите его на окно процесса, который вы хотите убить и щелкнуть или ударить Введите , чтобы убить его. Если вы передумаете, просто нажмите Escape , чтобы вернуться к обычному курсору. Также используйте с осторожностью, если вы щелкнете по фону, это убьет оболочку рабочего стола.