Замена Cygwin Sed против команд в истории - PullRequest
1 голос
/ 16 июня 2010

Я не смог найти ответ для этой конкретной проблемы, поэтому я спрошу его.

Я работаю в Cygwin и хочу ссылаться на предыдущие команды, используя нотацию !n, например, если команда5 было which ls, затем !5 запускает ту же команду.

Проблема в том, что при попытке выполнить подстановку, например:аргумент был для которого для команды номер 5.

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

bash: :s/which \([a-z]*\)/\1/: substitution failed

Ответы [ 2 ]

3 голосов
/ 16 июня 2010

Насколько я могу судить, синтаксис подстановки истории s/old/new/ выполняет только простую подстановку строк; он не поддерживает полные регулярные выражения. Вот что должен сказать man bash:

s/old/new/

Заменить new на первое вхождение old в строке события. Вместо / можно использовать любой разделитель. Последний разделитель необязателен, если он является последним символом строки события. Разделитель может быть заключен в старый и новый с одной обратной косой чертой. Если & появляется в new , оно заменяется old . Одна обратная косая черта будет указывать &. Если old равно нулю, для него устанавливается последнее old замещенное или, если не было предыдущих подстановок в истории, последняя строка в !?string[?] поиск.

Не бойся, хотя. На самом деле есть более простые способы выполнить то, что вы пытаетесь сделать:

  1. !$ соответствует последнему аргументу предыдущей команды:

    # ls /etc/passwd
    /etc/passwd
    # vim !$
    vim /etc/passwd
    
  2. !5:$ соответствует последнему аргументу команды # 5:

    # history
    ...
    5: which ls
    ...
    # !5:$
    ls
    
  3. Вы также можете использовать Alt + . для выполнения немедленной замены, эквивалентной !$. Alt + . - один из лучших трюков, которые я знаю.

0 голосов
/ 16 июня 2010

Это сработало для меня, используя Bash в Cygwin (обратите внимание, что моя which ls команда была номером 501 в моем списке истории; не 5, как у вас):

$(!501 | sed 's/which \([a-z]\)/\1/')

Вы также можете сделать это так (короче / чище):

$(!501 | sed 's/which //')

...