Это было первоначально опубликовано в этом вопросе, но позже было предложено разместить здесь.
Вот как вы можете использовать fc
и history
с псевдонимами для !-
как подстановки. Предположим, если вы хотите использовать ! -n
(где n - цифра для nth последней использованной команды), то вы можете использовать fc
и history
с псевдонимом следующим образом:
Использование history
:
alias xyz='echo $(history -p "! -") ; sudo $(history -p "!-n")'
Примечание: Здесь !-n
должно быть заключено в '
или ''
.
Использование fc
:
alias xyz='echo $(fc -ln -n -n) ; sudo $(fc -ln -n -n)''
Примечание: здесь 1st и 2nd-n
используются для указания диапазона списка истории.
Здесь я использовал echo-ing перед выполнением команды для получения эффекта !-
.
Вы можете использовать sed
следующим образом:
sed -e '/,$/{N; /\]/s/,[^,]*$//;}' file
987678680
123435434-
]
2345643
2345632-
]
234563
1234567654
Или согласно @steeldriver, это можно упростить в Bash
следующим образом:
sed '$!N; s/,\n]//'
При работе с такого рода задачами (редактировать/делать что-то, если последовательные строки соответствуют определенному шаблону )самый простой способ сделать это с sed
, вероятно, черезN;P;D
цикл , также известный как "скользящее окно":
sed -e '$!N;s/,\nPATTERN//;t' -e 'P;D' file
Это вводит строку N
ext в пространство шаблонов и безоговорочно пытается s
заменить ее в соответствии с требованием. Затем он t
проверяет, была ли замена успешной :, если да, то переходит в конец скрипта (без метки )и автоматически печатает пространство шаблона, в противном случае он P
перепечатывает и D
удаляет первую строку из пространства шаблонов и перезапускает цикл.
Другой метод GNUsed
:
sed ':x /,$/{N;s/,\n]//;T x}' file
Это работает корректно, даже если запятая стоит в четной -пронумерованной строке. Пример:
printf '%s\n' 1, 2, ']' | sed ':x /,$/{N;s/,\n]//;T x}'
Выход:
1,
2
Как это работает:
В большинстве языков программирования адресные метки являются полностью пассивными --метками, обозначающими код, но никогда не изменяющими действие этого кода. Но не sed
. В sed
переход к метке в начале программы фактически меняет действие кода или, скорее, позволяет избежать неявного кодаn
ext -строки , с которого обычно начинается sed
цикл.
КомандаT
est and branch if failed T x
проверяет, не сделала ли ничего предыдущая командаs
ubstitute , и если да, то переходит к метке :x
в начале без ни печати чего-либо, ни чтения новой строки. Это означает, что любая нечетная -пронумерованная строка, выбранная с помощью append N
ext строки , которая не была заменена, будет повторно -просканирована, как и должно быть.
Для не-GNU sed
, (, когда команда T
недоступна и синтаксис не является разрешающим ),это должно быть более портативным:
sed ':x
/,$/{
N
s/,\n]//
t
b x
}' file