在Bash脚本中,循环文件中的行并修改它们?

时间:2013-04-24 22:16:44

标签: bash loops sed

我只是在学习Bash脚本,我在这里找不到适合我的答案,所以这就是我要做的......

我的文件list.txt包含这样的内容..

group: 43  [message]
group: 312  [message]
group: 501210  [message]

在bash脚本中,我试图循环遍历整个文件并修复格式(删除冒号,在'group'和数字之间只留一个空格,最后删除数字后面的所有内容) :

group 43
group 312
group 501210

然后应该将其保存到同一个文件list.txt中,覆盖以前的内容。但是,我甚至无法弄清楚如何删除':'..

这是我的代码......

for line in $(< list.txt);do
sed 's/:/""/';
done

似乎加载第一行然后在无限循环中丢失。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

你不需要for循环。 sed one liner可以完成这项工作:

sed -ir 's/(group):( [0-9]+).*/\1\2/' list.txt

或awk one-liner:

awk -F': | ' '{print $1,$2}' list.txt > /tmp/t.tmp && mv /tmp/t.tmp /path/to/list.txt

答案 1 :(得分:0)

由于这是关于学习bash脚本,你可以这样做:

while read group nr rest
do
  printf "%s %d\n" "${group%:}" "$nr"
done < file > newfile && mv newfile file

或者输入文件中“group”没有变化:

while read group nr rest
do
  printf "group %d\n" "$nr"
done < file > newfile && mv newfile file

但这通常比使用sedawk等更慢。