最近工作上遇到这样一个事情,有如下面的打印信息,需要把它们拷贝到页面上方便领导们察看,但看打印它们本来是一条数据但却被换行了,直接拷贝到页面上察看效果肯定不行。
红线画的每一行的下面一行其实是跟它在一行才对,那样数据看起来才整齐,如:
领导对这事跟得紧也没时间去看代码了,只能手动一行一行删换行符、空白符再回车。下面是文心一言写的:
#!/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
这个脚本并不完美,因为有些行处理不了,不过已经算是很好用了,使用后的情况对比如下: