web-dev-qa-db-ja.com

カットコマンド改行

次のようなファイルがあります。

one
two 
three 
four

ファイルを1行ずつスキャンするために、bashスクリプトでforループを使用したいと思います。以前はcutを使用しましたが、cutコマンドに改行区切り文字を指定できませんでした。どうすればよいですか?

この方法では機能しません:

cut -d'\n' -f1

なにか提案を ?

20
pedr0

連結または表示するには、catを使用します。ここでは必要ありません:

while read line ; do
    echo "$line"
done < file
13
Benoit

私は同じ問題に自分自身を見つけました、これは私にとってはうまくいきます:

cat file.cut | cut -d$'\n' -f1

または:

cut -d$'\n' -f1 file.cut
54
Ivan

単に使用:

echo -n `cut ...`

これは最後の\ nを抑制します

3
Philipp Murry

したがって、いくつかの本当に良い(おそらくより良い)回答が既に提供されています。しかし、元の質問のフレージングを見て、BASH forループを使用したいと思ったとき、Field Separator IFSの変更による解決策について誰も言及しなかったことに驚きました。受け入れられた読み取り行と同じように、それは純粋なbashソリューションです

old_IFS=$IFS
IFS='\n'
for field in $(<filename)
do your_thing;
done
IFS=$old_IFS
1
DOK

出力が常に改行で区切られることが確実な場合は、head -n 1の代わりにcut -f1を使用します(スクリプトでforループについて言及し、最終的にはスクリプトに関連しない質問であったことに注意してください)。

承認されたものを含む他の多くの回答には、不必要に複数の行があります。これを複数の行で行ったり、システムのデフォルトの区切り文字を変更したりする必要はありません。

また、Ivanが-d$'\n'で提供したソリューションは、Mac OSXでもCentOS 7でも機能しませんでした。彼の答えは4年前なので、$のロジックに何か変更があったに違いないと思います。この状況のキャラクター。

1
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
1
0xC0000022L