猫のワイルドカード印刷で改行を強制する


9

複数の小さなファイル(すべてのファイルが1文)を標準出力に出力するために、bashでワイルドカードを使用した猫を使用したいと思います。ただし、個別のファイルの内容は改行で区切られていません。読みやすくするために改行します。

このコマンドにある種のファイル区切り文字を追加するにはどうすればよいですか?

回答:


12

すべてのファイルの後に行末を出力するシェル関数を定義し、次の代わりに使用しますcat

endlcat() {
  for file in "$@"; do
    cat -- "$file"
    echo
  done
}

その後、使用できますendlcat *

forループは、すべての提供の引数(上のループ$@あなたのようなワイルドカードを使用する場合、既にシェルでエスケープされています)*--ダッシュで始まるファイル名に詰まらないようにする必要があります。最後に、echo出力は改行です。


後から反復を使用するのはかなり明白なようです!猫に旗があるのではないかと思ったのですが、これでも大丈夫!ありがとうございました。
lennyklb 2015年

あなたは必要ありませんin "$@"-それは暗黙的です。
l0b0

4
明示的であることは読みやすさのために良いです。
cas

5

単純な代わりにループを使用するだけcatです:

for file in /path/to/targetdir/*; do
    echo "-------- $file -------"
    cat "$file" 
done

受け入れられた回答のように機能しますが、その1つはコマンドラインへの次のステップも持っていたので、もう1つを受け入れました。
lennyklb 2015年

3

ファイル間でファイル名が必要な場合は、次を使用しtailます:

tail -n +1 ./*

(のtac代わりに必要な場合cat、一部のtail実装には-r同等のtac機能のオプションがあります)


3

これは動作します:

sed '' -- *

シェルループなどは必要ありません。これにより、ファイルの出力の後に\newlineが続きます-おそらく最後のものを除きます。

それ以外の場合、各ファイルの出力の間に空白行を出力したい場合は、次のように機能します。

bpaste(){
    eval "paste -'sd\n' -- $(x=0;for f do printf "\"\${$((x+=1))}\" - ";done)"
}   </dev/null

これは常に、\newline 追加の空白行を含むファイルの出力に従います。

次のように呼び出すことができます:

bpaste *

@cuonglm-opはファイル間の改行を要求します。これにより、ファイル間の改行が保証されます。
mikeserv

@cuonglm-もう一度やり直してください。for n in 1 2 3; do printf "$n" >"$n"; done; sed '' -- [123]
mikeserv 2015年

@cuonglm-any sedは常に何かを印刷する\n前にewlineを印刷する必要があります。ただし、最後のファイルの最終行には\newlineが追加されない場合があります。私は以前にこの質問に答えたと誓うことができました。
mikeserv 2015年

@cuonglm-私はあなたが何を意味するのか理解できません。シェルのほんの少しだけ私はあなたにプリントを与えました1\n2\n3。できます。常にそうです。それはあなたのために何を印刷しますか?
mikeserv 2015年

1
@DennisWilliamson:\nRHSでの使用は標準ではありません。使用できますsed -e '$G'
cuonglm 2015年

2

@terdonの回答と同様に、将来的にもファイル名を見たい場合は、head次のコマンドを使用できます。

$ head *file*
==> file_1 <==
file 1 content

==> file_2 <==
file 2 content

==> file_3 <==
file 3 content

headデフォルトでは最初の10行なので、ケースにコマンドオプションなしで使用すると(ファイルごとに1文)完全に問題ありません。それ以外の場合は、-n Xオプションが必要です。


2

別の方法- grep -h各ファイルで空の文字列を単に検索するために使用します。これは、改行の数や改行の有無に関係なく、すべての行に一致します。grepの結果は常に改行で終了します。この-hオプションは、出力の各行の前に、ファイル名を付けないようにします。

$ printf 'a' > a
$ printf 'b\nB' > b
$ printf 'c\n' > c
$ ls
a  b  c
$ cat -- *
ab
Bc
$ grep -h '' *
a
b
B
c
$ 

または、区切り文字として改行を使用してpaste-serialモードでGNU を使用できます。

$ paste -s -d '\n' -- *
a
b
B
c
$ 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.