私のコンピュータには3つのMarkdownファイルがあります。
$ ls | grep md
bar.md
baz.md
foo.md
各ファイルには指定された内容があります。
$ cat *md
i am bar
i am baz
i am foo
*.md
たとえば、「パターンに一致するすべてのファイルを繰り返して、次のパターンを印刷したいfile_name: file_contents
」
私が一番好きなのは、ルビーを使うことです。しかし、私は練習したいです。ループの bashそして私の発展もアッ技術。
私にとっては、Rubyが最も簡単です。
#!/usr/bin/env ruby
# iterate over all markdown files in current directory
Dir.glob('*.md').each do |some_file|
puts "#{some_file}: #{File.read(some_file)}"
end
出力:
$ ./iterate_over_files.rb
bar.md: i am bar
baz.md: i am baz
foo.md: i am foo
そしてリンクをたどるバッシュリソース次のforループを作成しました。
#!/usr/bin/env bash
# iterate over all markdown files in current directory
for some_file in *.md
do
echo $some_file: `cat $some_file`
done
同じ出力を提供します。
$ diff <(./iterate_over_files.sh) <(./iterate_over_files.rb) # no difference
デモを見て学んだブライアンコナハンそしてレビューで彼のスライド次のパターンに従うので、awkを使用する良い機会です。
for each file
for each input line
for each pattern
if the pattern matches input line
do the action
- awkを使用してこのパターンを活用し、すべてのMarkdownファイルを繰り返し、フォーマットされた結果を印刷するにはどうすればよいですか?
答え1
FILENAME変数を使用して各ファイルを処理し、ファイル名を出力するのはどうですか?
$ awk '{print FILENAME":",$0}' *.md
bar.md: i am bar
baz.md: i am baz
foo.md: i am foo
$
またはこれは少し見苦しいですが、ファイル名の後にファイルの内容を$ 0に設定するだけです。デフォルトの動作はawk
$ 0を印刷することなので、必要ありませんprint
。
$ awk '$0=FILENAME": "$0' *.md
bar.md: i am bar
baz.md: i am baz
foo.md: i am foo
$
別の方法。 FILENAMEを使用する代わりに、ARGVパラメーター配列を使用してください。
$ awk '$0=ARGV[++z]": "$0' *.md
bar.md: i am bar
baz.md: i am baz
foo.md: i am foo
$
答え2
bash
マニュアルによると、$(< FILE)
代わりにを使用する必要があります$(cat FILE)
。ただし、コマンド置換をまったく使用する必要はありません。
for some_file in *.md
do
echo -n "$some_file: "
cat $some_file
done
プロセスの置き換えについて既に知っているので、次のこともできます。
for some_file in *.md
do
cat <(echo -n "$some_file: ") $some_file
done