Просто меняйте буферы каждый раз, когда вы сталкиваетесь с этой строкой, если пространство шаблонов содержит ту же строку, удалите ее, в противном случае извлеките строку из буфера удержания:
sed -e '/^AAA$/{x;//d;g' -e'}' infile
или
sed '/^AAA$/{
x
//d
g
}' infile
Прежде всего, вы должны начать использовать кавычки. Наверняка вы заметили, что
if [ $REPLY = "command" ]не работает (и выдает
[: too many arguments
сообщение об ошибке ). если вы вводите командную строку с более чем одним словом. Вам нужно изменить это на if [ "$REPLY" = "command" ]
Полагаю, вы понимаете, что ваш текущий сценарий получает всю строку ввода в $REPLY
. Но,если пользователь вводит cd /usr/local
, вам не к чему сравнивать cd /usr/local
с cd
; вам нужно извлечь первое слово входной строки. Вы можете сделать это с помощью word1="${REPLY%% *}"
. Это пример расширения параметра, о которых вы можете прочитать в bash (1)или спецификации POSIX . Таким образом, вы можете изменить свой скрипт следующим образом:
︙ if [ "$REPLY" = "clear" ]; then clear fi word1="${REPLY%% *}" if [ "$word1" = cd ] then $REPLY fi ︙
Редко, когда вы хотите прочитать всю строку; чаще (как в этом примере )вам нужна оболочка чтобы разбить строку на слова. Вы делаете это, давая команде read
список переменных для чтения в :
︙ read -p "ECLI$PWD/:>" cmd args ︙ if [ "$cmd" = "clear" ]; then clear fi if [ "$cmd" = cd ] then cd "$args" fi ︙
Описанные выше подходы подходят для проверки -концептуальных игрушек -. В реальном приложении вы бы хотели, чтобы оболочка разбивала строку ввода сколько бы слов ни было. Вы делаете это, читая в массив, используя опцию -a
:
︙ read -p "ECLI$PWD/:>" -a arr ︙ if [ "${arr[0]}" = "clear" ]; then clear fi if [ "${arr[0]}" = cd ] then cd "${arr[1]}" fi ︙.