perl のワンライナーに関しての、適当な解説 #1/#2/#3/#4
一般的な事
ワンライナーは、コマンドラインフィルターの常套手段。
つーことで、初歩的なコマンドラインフィルターを2、3
ああ、当然 perl
で説明しますが、 awk
でも普通に出来ることも
mac only
pbpaste
もちろんご存知 pbpaste
s/\r/\n/g
$ pbpaste | perl -lpe 's/\r/\n/g' | pbcopy
nkf
使いたいけどね
URL
例えば、URL 引っ込ぬくのに
$ pbpaste | perl -lpe 's/^/curl -O /' | sh
# $ pbpaste | perl -lne 'qx{curl -O $_}' # 別解
なんてして、sh
に食わせるのは基本
ファイルに一々保存して、cat SOMETING.txt | perl ...
なんて事はやりたくない、、、
URL と他の文が混っているならば、
$ pbpaste | perl -lne 'qx{curl -O $1} if /(http.*?jpg)/'
# 正規表現部分は、本来はもっとしっかりと書くべき
URL が一行一サイトに限らないのであれば、
$ pbpaste | perl -lne 'qx{curl -O $1} while /(http*?.jpg)/g'
Automator でサービス化するんだったらもちょっと正規表現には手を加えないといけない、、、
tree もどき
mac には存在しない tree
コマンド
perl で実装するとこんな感じ
find . | perl -MCwd -lpe 'my $f = -d ; s{[^/]*/}{+--}g;s{\+--(?=\+)}{ }g;s/^\.$/getcwd/e ; $_ .= q{/} if $f'
ネットのどこかで拾ったものを改造
実際の運用では、.bashrc
に
function tree () {
find . "$@" | perl -MCwd -lpe 'my $f = -d ; s{[^/]*/}{+--}g;s{\+--(?=\+)}{ }g;s/^\.$/getcwd/e ; $_ .= q{/} if $f'
}
とでも書いて、
$ tree -maxdepth 2
などとする
2019/02/21 追記
現状では、
function tree () {
find $(pwd) "$@" | \
perl -lpe '$a //= $_ ; my $f = -d ;' \
-e 's{$a}{} ; s{[^/]*/}{+--}g; s{\+--(?=\+)}{ }g; ' \
-e '$_ ||= $a ; ' \
-e '$_ .= q{/} if $f'
}
こっちだと -name '.*' -prune -o -print が効く。
$ tree -maxdepth 2 -name '.*' -prune -o -print | head
/Users/bunzaemon/
+--Music/
+--iTunes/
+--cmd/
+--homebrew/
+--Pictures/
+--写真 Library.photoslibrary/
+--Library/
+--Application Support/
+--Maps/
不可視ファイルが見えなくなってすっきり。