BASH自动填充空格,直到下一行有值

时间:2017-09-22 14:58:43

标签: bash replace spaces

我需要帮助: 我有一个像这样的输出文件:

001 value  
    value  
045 value  
    value  
    value  
068 value     
098 value  
    value  

我需要一个命令来获得这样的输出:

001 value
001 value
045 value
045 value
045 value
068 value
098 value
098 value

1 个答案:

答案 0 :(得分:1)

awk

足够简单
awk '/^[0-9]/{prefix=$1;$1=""}{sub(/^ +/,"");print prefix,$0}' test.in

这适用于以数字开头的任何前缀。

原始bash字符串操作。比sed更容易理解,但也可以硬编码3个字符,不一定是数字前缀。

while IFS= read -r line; do
    if [[ "${line:0:3}" != "   " ]]; then
        prefix="${line:0:3}"
    fi
    printf '%s%s\n' "$prefix" "${line:3}"
done < test.in

这也可以使用sed来完成,尽管它比通常的sed命令更复杂一些。它假设有3位数的前缀 -E适用于BSD sed;如果您使用的是GNU -r,则应将其替换为sed

sed -E '/^[0-9]{3} /{h
s/(...).*/\1/
x
n
}
G
s/...(.*)\n(.*)/\2\1/
' file.txt