次のようなファイルがあります。
one
two
three
four
ファイルを1行ずつスキャンするために、bashスクリプトでforループを使用したいと思います。以前はcut
を使用しましたが、cut
コマンドに改行区切り文字を指定できませんでした。どうすればよいですか?
この方法では機能しません:
cut -d'\n' -f1
なにか提案を ?
連結または表示するには、cat
を使用します。ここでは必要ありません:
while read line ; do
echo "$line"
done < file
私は同じ問題に自分自身を見つけました、これは私にとってはうまくいきます:
cat file.cut | cut -d$'\n' -f1
または:
cut -d$'\n' -f1 file.cut
単に使用:
echo -n `cut ...`
これは最後の\ nを抑制します
したがって、いくつかの本当に良い(おそらくより良い)回答が既に提供されています。しかし、元の質問のフレージングを見て、BASH forループを使用したいと思ったとき、Field Separator IFSの変更による解決策について誰も言及しなかったことに驚きました。受け入れられた読み取り行と同じように、それは純粋なbashソリューションです
old_IFS=$IFS
IFS='\n'
for field in $(<filename)
do your_thing;
done
IFS=$old_IFS
出力が常に改行で区切られることが確実な場合は、head -n 1
の代わりにcut -f1
を使用します(スクリプトでforループについて言及し、最終的にはスクリプトに関連しない質問であったことに注意してください)。
承認されたものを含む他の多くの回答には、不必要に複数の行があります。これを複数の行で行ったり、システムのデフォルトの区切り文字を変更したりする必要はありません。
また、Ivanが-d$'\n'
で提供したソリューションは、Mac OSXでもCentOS 7でも機能しませんでした。彼の答えは4年前なので、$
のロジックに何か変更があったに違いないと思います。この状況のキャラクター。
cat FILE|while read line; do # 'line' is the variable name
echo "$line" # do something here
done
または(コメントを参照):
while read line; do # 'line' is the variable name
echo "$line" # do something here
done < FILE