Bash

如何從一個字元或模式 grep 到另一個?

  • May 13, 2020

我想從一個給定的字元或模式grep一個字元串,直到另一個給定的字元或模式而不是整行。

例如:

$ > echo "The brown fox jumps over the lazy dog" | grep -option "b" "s"
brown fox jumps

$ > echo "The brown fox jumps over the lazy dog" | grep -option "the l" "g"
the lazy dog

我真正需要的是在我使用時grep一條路徑,dirs -v以便我可以做到這一點:

$ > ls -AF
file.txt   github/    .vim/

$ > dirs -v
0    ~
1    ~/.vim/pack/themes
2    ~/.vim/colors
3    ~/github/dirname
4    ~/github/repo/

$ > mv -v file.txt $(dirs -v | grep 2 | grep -option "~" "colors")
renamed 'file.txt' -> '~/.vim/colors/file.txt'

我使用了 grep 兩次,因此我只能將~與包含2. 有沒有辦法在我的 .zshrc 中將其作為 shell 函式/別名來完成?


答案:我只是mv file.txt ~2從以下答案之一中使用。我什至不認為我能做到這一點,大聲笑。

我還將這些行從以下答案之一放入我的 .zshrc 中。

function grepo () { grep -Po "${1}.*?${2}" }
alias -g GO='| grepo'

這樣我就可以像這樣使用它:

$ > echo "the brown fox jumps over the lazy dog" GO b s
brown fox jumps

$ > echo "the brown fox jumps over the lazy dog" GO "the l" g
the lazy dog

$ > echo "the brown fox jumps over the lazy dog" GO fox over
fox jumps over

對於我的問題,由於某種我無法想到的原因,它沒有起作用。

$ > ls -AF
file.txt   github/    .vim/

$ > dirs -v
0    ~
1    ~/.vim/pack/themes
2    ~/.vim/colors
3    ~/github/dirname
4    ~/github/repo/

$ > mv file.txt $(dirs -v GO "~/.v" "themes")
mv: cannot move 'file.txt' to '~/.vim/pack/themes': No such file or directory

zsh中,您可以執行以下操作:

$ str='The brown fox jumps over the lazy dog'
$ print -r -- ${(SM)str#b*s}
brown fox jumps

${str#pattern}ksh 運算符從字元串的開頭刪除與匹配的最短字元串。pattern( Sfor substring )參數擴展標誌對其進行了擴展,因此模式不限於在開始時匹配,而是從開始時盡可能接近。M標誌(用於匹配)使這些擴展運算符擴展到匹配的內容,而不是刪除匹配的部分。

使用##而不是#讓你得到最長的而不是最短的和%/%%從字元串末尾尋找模式。

您還可以進行 PCRE 匹配並將其*?非貪婪運算符用於:

$ zmodload zsh/pcre
$ [[ $str -pcre-match 'b.*?s' ]] && print -r -- $MATCH
brown fox jumps

或者:

$ set -o rematchpcre
$ [[ $str =~ 'b.*?s' ]] && print -r -- $MATCH
brown fox jumps

不過,對於您的特定案例,我會這樣做:

mv file.txt ~2

將文件移動到 dirstack 中的第二個目錄。

如果配置正確,完成將在您按下after 後顯示~<number>對應的內容:Tab``~+

$ mv 文件 ~+Tab
完成目錄堆棧
1 -- ~/install/cvs/zsh/Config
2 -- ~
3 -- /usr
4 -- ~bin
5 -- ~
6 -- /

~/.zshrc產生該輸出的最小值如下所示:

set -o autopushd
autoload -Uz compinit
compinit
zstyle ':completion:*' menu select=0
zstyle ':completion:*' verbose true
zstyle ':completion:*' format 'Completing %d'

(另請參閱compinstall以更適合初學者的方式自定義完成)。

引用自:https://unix.stackexchange.com/questions/586264