【问题标题】:In a Bash script, loop through lines in a file and modify them?在 Bash 脚本中,遍历文件中的行并修改它们?
【发布时间】:2013-04-18 15:56:25
【问题描述】:

我刚刚学习 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

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

【问题讨论】:

    标签: bash loops sed


    【解决方案1】:

    你不需要 for 循环。 sed 一个班轮可以完成这项工作:

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

    或 awk 单行:

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

    【讨论】:

    • @mklement 感谢您对 Mac 的提示。我对 Mac OS 有 0 经验。我也猜OS X sed 也没有-i,对应的选项是什么?
    • -i 确实存在于 OS X 上 - 相同的含义:编辑文件(用sed 的输出覆盖它) - 但是,有一个至关重要的区别 :要使其在 OS X 上运行,请使用 -i '' - '' 表示:不要创建 original 文件的副本;如果你想创建一个副本,比如扩展名为.bak,请使用-i '.bak'
    • @mklement 即-i后面的空字符串是必须的。很高兴知道。谢谢。
    • 没错。总结一下:在OS X 上,在sed 命令中,使用-E 而不是-r-i ''(必须是单独的 选项和空字符串作为参数)而不是仅仅-i.
    • BSD sed 手册页中建议不要使用空字符串:It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.
    【解决方案2】:

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

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

    或者如果“组”在输入文件中没有变化:

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 2016-08-31
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多