这个脚本怎么写?

        最近工作上遇到这样一个事情,有如下面的打印信息,需要把它们拷贝到页面上方便领导们察看,但看打印它们本来是一条数据但却被换行了,直接拷贝到页面上察看效果肯定不行。

红线画的每一行的下面一行其实是跟它在一行才对,那样数据看起来才整齐,如:

领导对这事跟得紧也没时间去看代码了,只能手动一行一行删换行符、空白符再回车。下面是文心一言写的:

#!/bin/bash

input_file="input.txt"
output_file="output.txt"
first_line=true
building_line=""

while IFS= read -r line; do
    line="${line%$'\n'}"
    line="${line##*( )}"

    if $first_line; then
        # 处理第一行,直接打印
        echo "$line" >> "$output_file"
        first_line=false
    elif [[ "$line" == \|* ]]; then
        # 行以 '|' 开头,追加到前一行
        line="${line#\|}"
        line="${line##*( )}"
        building_line+="$line"
    else
        # 行不以 '|' 开头,打印前一行(如果有的话),并开始新的一行
        if [[ -n "$building_line" ]]; then
            echo "$building_line" >> "$output_file"
            building_line=""
        fi
        building_line="$line"
    fi
done < "$input_file"

# 打印最后一行(如果有的话)
if [[ -n "$building_line" ]]; then
    echo "$building_line" >> "$output_file"
fi

# 可选:查看输出文件的内容
# cat "$output_file"

但结果没用。下面是我写的,效果还可以:

#!/bin/bash

input_file=$1
output_file=output_$1
current_line=""
previous_line=""
flag=true

if [ $# -ne 1 ]; then
    echo "Usage: $0 file_name"
    exit
fi


if [ -f "$output_file" ]; then
    rm "$output_file"
fi

cat $input_file | while read line
do
    current_line="$line"
    #找到以 | 且后跟着1个或多个空白符的行
    if [[ "$line" =~ \|[[:space:]]{1,}$ ]];then
        flag=true
        previous_line=$(echo "$line" | sed -E 's/[[:space:]]+$//') #去掉空白符及换行符
    else
        if $flag ;then
            current_line="$previous_line""    $line"#假如上一行是以 | 结尾,把这一行连接上去,多加了几个空格好看点
        fi  
        flag=false
        echo "$current_line" >> "$output_file"  #重新写到文件里
    fi  
done

这个脚本并不完美,因为有些行处理不了,不过已经算是很好用了,使用后的情况对比如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值