2012-03-06 3 views
14

У меня есть файл, как это:вырезать

one 
two 
three 
four 

Я хотел бы использовать для цикла в Баш скрипт для сканирования в файл строка за линию. Раньше я использовал cut, но я не смог дать команду cut разделителю новой строки, как я могу это сделать?

Таким образом, он не работает:

cut -d'\n' -f1 

Любое предложение?

ответ

11

Использование cat для конкатенации или отображения. Не нужно здесь:

while read line ; do 
    echo "$line" 
done < file 
+0

Я бы согласился с этим, но это заметно медленнее, чем подход «вырезать». –

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 
+2

[UUOC] (http://en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat) - использовать 'в то время как ... сделано Kevin

+0

Это не бесполезно, это, возможно, расточительно (после прочтения этого абзаца), но это также более читаемый ИМО. – 0xC0000022L

-1

Мое мнение, что «cut» использует «\ n» в качестве разделителя по умолчанию. Если вы хотите использовать вырезать, у меня есть два пути:

cut -d^M -f1 file_cut 

я делаю^M, нажав на кнопку Enter После Ctrl + V. Другой способ:

cut -c 1- file_cut 

Помогло ли это?

+0

К сожалению, ни один из вышеперечисленных не работал для меня (bash, версия 4.2.45). –

39

я оказался в той же самой проблемой, это работает для меня:

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

Или:

cut -d$'\n' -f1 file.cut 
+0

Это отлично работает для меня :) спасибо – Sina

3

Просто используйте:

echo -n `cut ...` 

Это подавляет \ п на конец

1

Итак, сом e действительно хорошие (возможно, лучшие) ответы уже были предоставлены. Но, глядя на формулировку исходного вопроса, желая использовать BASH for-loop, меня поразило, что никто не упоминал о решении с изменением IFS полевого разделителя. Это чистый раствор баш, так же, как принято читать строки

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