私のコンピュータには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
$