まず、私は人々がよく言及するように、この方法が正しくないことを知っています。lsの出力を解析しない理由しかし、それは私の大学プロジェクトの一部です(したがって、sedとawkの両方を使用できます)。
名前が指定された文字列で始まるファイルを見つける必要があります。私は以下を使用して現在のディレクトリを一覧表示することから始めましたls
。
ls -LR1
これにより、サンプル出力が提供されます。
.:
bin
etc
games
include
lib
man
sbin
share
src
./bin:
apt
gnome-help
highlight
mint-sha256sum
pastebin
search
szukaj
yelp
./etc:
./games:
./include:
./lib:
python2.7
python3.5
./lib/python2.7:
dist-packages
site-packages
./lib/python2.7/dist-packages:
./lib/python2.7/site-packages:
./lib/python3.5:
dist-packages
./lib/python3.5/dist-packages:
./man:
./sbin:
./share:
ca-certificates
emacs
fonts
man
sgml
xml
./share/ca-certificates:
./share/emacs:
site-lisp
./share/emacs/site-lisp:
./share/fonts:
./share/man:
./share/sgml:
declaration
dtd
entities
misc
stylesheet
./share/sgml/declaration:
./share/sgml/dtd:
./share/sgml/entities:
./share/sgml/misc:
./share/sgml/stylesheet:
./share/xml:
declaration
entities
misc
schema
./share/xml/declaration:
./share/xml/entities:
./share/xml/misc:
./share/xml/schema:
./src:
ここで、名前が与えられた文字列で始まるファイルを使用またはインポートsed
したいと思います。たとえば、次のような結果を得たいと思います。awk
'Do'
sed
(またはawk
?)各行を解析し、次から始まる行を検索します。'Do'
- 一致するものがある場合は、前の行に移動して検索してください。 (これは相対パスを表します)、一致するものがない場合は前の行にジャンプするなどの操作を実行します。
- 行を相対パスで印刷します。
.path/filename
でも可能ですか?ご協力ありがとうございます!
答え1
たとえば、次のファイルを見てみましょう。
$ ls -LR1
.:
a
./a:
b
./a/b:
bad
Do_good
それでは、目的のファイルを探してみましょう。
$ ls -LR1 | awk '/^\.\//{sub(/:$/, "/", $0); dir=$0} /^Do/{print dir $0}'
./a/b/Do_good
仕組み:
/^\.\//{sub(/:$/, "/", $0); dir=$0}
aで始まる行が見つかるたびに、
./
検索をaに置き換えて変数を更新します。:
/
dir
/^Do/{print dir $0}
で始まる行が見つかるたびに、その行の後
Do
の変数を印刷します。dir
限定:ご存知のように、出力はls
人間が読めるように作成されており、解析は信頼できません。このコードはデモ用にのみawk
使用してください。
好ましい方法--1
〜のようにワイルドカード指摘されているのは、find
仕事に適したツールです。
$ find . -name 'Do*'
./a/b/Do_good
好ましい方法 - 2(bashが必要)
バッシュでは先行は達成するのが難しいglobstar関数を使用してファイルを再帰的に検索できることを指摘しました。
shopt -s globstar nullglob
printf '%s\n' **/Do*
答え2
を使用すると、sed
予約済みスペースを使用して最後に表示したディレクトリへのパスを保存できます。
sed -n '
/^\..*:$/{
h;d
}
/^Do/{
G
s|\(.*\)\n\(.*\):|\2/\1|p
}'