내 컴퓨터에는 세 개의 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