我有一个这样的文件:
one
two
three
four
我想在bash脚本中使用for循环来扫描文件行以获取行。以前我使用cut
但是我无法给cut
命令提供换行符分隔符,我该怎么办?
这样就不起作用了:
cut -d'\n' -f1
有什么建议吗?
答案 0 :(得分:53)
我发现自己遇到了同样的问题,这对我有用:
cat file.cut | cut -d$'\n' -f1
或者:
cut -d$'\n' -f1 file.cut
答案 1 :(得分:13)
使用cat
进行连接或显示。这里不需要它:
while read line ; do
echo "$line"
done < file
答案 2 :(得分:3)
只需使用:
echo -n `cut ...`
这会抑制最后的\ n
答案 3 :(得分: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
答案 4 :(得分:1)
因此,已经提供了一些非常好(可能更好)的答案。但是看一下原始问题的措辞,想要使用BASH for-loop,我很惊讶没有人提到改变Field Separator IFS的解决方案。这是一个纯粹的bash解决方案,就像接受的读取行
一样old_IFS=$IFS
IFS='\n'
for field in $(<filename)
do your_thing;
done
IFS=$old_IFS
答案 5 :(得分:0)
如果您确定输出将始终以换行符分隔,请使用head -n 1
代替cut -f1
(请注意,您在脚本中提到了for循环,而您的问题最终不是脚本-相关)。
许多其他答案(包括已接受的答案)不必要地包含多行。无需跨多行执行此操作,也无需更改系统上的默认定界符。
此外,Ivan用-d$'\n'
提供的解决方案在Mac OSX或CentOS 7上都不适合我。由于他的回答已有4年之久,所以我认为{{ 1}}字符。
答案 6 :(得分:0)
令人惊讶的是,在那 9 年的搜索中,没有人提出另一种方法。我怀疑我在撰写本文时看到的其他答案会更慢。
你可以这样做
some_output | sed 's/\\n/ /g' | cut -d ' ' -f 1
答案 7 :(得分:-2)
我的观点是“cut”使用'\ n'作为默认分隔符。 如果你想使用cut,我有两种方法:
cut -d^M -f1 file_cut
我制作^ M按Ctrl + V后单击Enter。另一种方式是
cut -c 1- file_cut
这有帮助吗?