Bash
如何從一個字元或模式 grep 到另一個?
我想從一個給定的字元或模式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
(S
for 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
以更適合初學者的方式自定義完成)。