2

最後の行の終わりにEOLがないファイルがあります。そこから読み取るbashスクリプトが最後の行を処理していなかったときに、これに気づきました。

私はそれからこのように読んだ:

while read LINE
do
    ...
done <thefile

ファイルは私に提供されているので、システム(Linux-OpenSuSE 10.2)に到達する前に私ができることは何もありません。ファイルを実行dos2unixしますが、不足しているEOLは解決されません。

viとを含むいくつかの解決策を見てきましたが、それらは少し不格好で、bashスクリプト内から使用できるed、おそらくを使用した、より適切な解決策があることを望んでいましたか?sed

奇妙なことにvi、ファイルを作成して、を実行すると、最後の行の最後に:set list「」が表示されます。「 」が表現$していると思っていたので、それが欠けているのではないかと期待していました。それとも、改行と行末の間に違いがありますか?$\n

4

5 に答える 5

5

ファイルに改行がない場合(および空白でない場合)、ファイルの末尾に改行を追加するオプションは次のとおりです。

if [ -s "$thefile" ] && [ "$(tail -c1 "$thefile"; echo x)" != $'\nx' ]; then
    echo >>"$thefile"
fi

または、ループを変更して、最後の改行の後に何かを処理する簡単な方法を次に示します。

while read LINE || [ -n "$LINE" ]
do
...
于 2012-05-09T15:04:46.933 に答える
4

これにより、ファイルの最後に改行が追加されます。

echo >> thefile
于 2012-05-09T13:56:49.377 に答える
4

sed -i -e '$a\' "path"EOFに改行がない場合にのみ、改行を追加します(ジャンプ後の説明)。

EOFに改行がない可能性のあるファイルを処理する場合readは、ループの後に出力変数が存在するかどうかを確認する必要があります。

while read LINE
do
    ...
done <thefile

if [ "${LINE+defined}" = defined ]
then
    ...
fi

あまりエレガントではありませんが、少なくとも、入力を処理する前に変更する必要はありません。

于 2012-05-09T14:03:51.577 に答える
1

いくつかのユーティリティは、出力の最後に改行を追加します。たとえば、cutanddoを使用できます。

cut -b 1- < thefile | 
while read LINE; do ...; done

(おそらく、カットのすべての実装が私が説明したように動作するわけではありませんが、多くは動作します。)

Robertの解決策はおそらく最も簡単であり、実際にファイルを変更できない場合は、次のことができます。

{ cat thefile; echo; } | while read ...

whileをパイプに入れるとサブプロセスに入れられ、スクリプトに影響を与える可能性があることに注意してください(たとえば、ループで行われた割り当ては保持されません)。そのため、一時ファイルまたは名前付きパイプを使用して変更する必要がある場合があります。データ。

于 2012-05-09T14:08:39.880 に答える
0

[ -n "$l" ]inbashに置き換えることができます[[ $l ]][[ $l ]]と同等[[ -n $l ]]です。$l単語の分割とパス名の展開は内部で実行されないため、引用符で囲む必要はありません[[

$ printf 'x\ny' | while IFS= read -r l; do echo "$l"; done
x
$ printf 'x\ny' | while IFS= read -r l || [[ $l ]]; do echo "$l"; done
x
y

$(tail -c1)ファイルが改行で終わるか、空の場合にのみ空になります。$()末尾から改行を削除し、tail -c1空のファイルの場合は空にします。-sファイルが存在し、空でないかどうかをテストします。

f=/tmp/some\ file
[[ -s $f && $(tail -c1 "$f") ]] && printf \\n >> "$f"

sed -n p(印刷なし、印刷)は。の代わりになりsed '$a\'ます。BSD sedsには、.-i ''だけでなくが必要です-i

sed -i '' -n p *.txt
于 2013-04-24T09:55:09.287 に答える