【问题标题】:Bash: split line into multiple lines [duplicate]Bash:将行拆分为多行[重复]
【发布时间】:2016-08-09 21:55:10
【问题描述】:

我有一个单词列表:

aaaa bbbb ccc dddd
eee fff ggg hhh
iii jjj kkk

我希望每个单词单独一行:

aaaa
bbbb
ccc
dddd
eee
fff
ggg
hhh
iii
jjj
kkk

如何在 最少字符数的 bash 中做到这一点?最好不用awk。

【问题讨论】:

    标签: bash split


    【解决方案1】:

    使用纯 bash:

    while IFS=" " read -r -a line
    do
        printf "%s\n" "${line[@]}"
    done < file
    

    见:

    $ while IFS=" " read -r -a line; do printf "%s\n" "${line[@]}"; done < file
    aaaa
    bbbb
    ccc
    dddd
    eee
    fff
    ggg
    hhh
    iii
    jjj
    kkk
    

    xargs:

    xargs -n 1 < file
    

    awk:

    awk '{for(i=1;i<=NF;i++) print $i}' file
    

    awk -v OFS="\n" '$1=$1' file
    

    使用 GNU sed:

    sed 's/ /\n/g' file
    

    使用操作系统sed

    sed $'s/ /\\\n/g' file
    

    cut:

    cut -d' ' --output-delimiter=$'\n' -f1- file
    

    grep:

    grep -o '[^ ]\+' file
    

    grep -Po '[^\s]+' file
    

    【讨论】:

    • 请注意,xargs 答案不会打印任何回显标志,例如,如果文件包含 -e/E-n,它将解释为 xargs 默认回显的参数。
    • sed 示例对我不起作用,至少在 MacOS 上是这样。这代替了sed -e $'s/,/\\\n/g'(在这里找到:stackoverflow.com/a/18410122/4358405
    • @TMG 是的!事实上你不需要-e。谢谢你的信息,我已经用它更新了我的答案。
    • 为什么--output-delimiter 中需要美元符号?它在那里做什么?
    • @Asclepius 因为如果我们单独使用--output-delimiter='\n',它将写入一个文字字符串“\n”而不是一个新行。 $'\n' 中的美元用于告诉命令不要按字面处理字符串。
    猜你喜欢
    • 2015-07-28
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多