Chinaunix

标题: 难题来了!简单的文本替换但要保持居中! [打印本页]

作者: bikkuri    时间: 2015-04-26 10:23
标题: 难题来了!简单的文本替换但要保持居中!
本帖最后由 bikkuri 于 2015-04-26 11:05 编辑

大家好!
我有一个问题向大家请教。
我做了一个登录欢迎画面如下:
  1.      ┌────────────────────────────────────────────────────────────────────┐
  2.      │                                                                    │
  3.      │                          WELCOME TO vbox!                          │
  4.      │                                                                    │
  5.      └────────────────────────────────────────────────────────────────────┘
复制代码
然后想把这个/etc/motd文件复制到N>100个服务器上去。
我的想法是用这个命令:
cat sample.motd|sed "s/vbox/$(hostname)/"
用本机的机器名来替换样本中的名字。
但是这样会发现由于机器名的长度不一致,导致显示不整齐。
效果如下图所示。

我想请教一下有什么办法可以在替换的时候保持显示内容居中,整个文本保持整齐呢?
机器名的长度可以是2-20个字符。
大家可以从这里下载带有彩色控制字符的原文件。

motd.tgz (378 Bytes, 下载次数: 22)
谢谢大家!
作者: liion631818    时间: 2015-04-26 10:23
回复 1# bikkuri
  1. :~$ echo '┌────────────────────────────────────────────────────────────────────┐
  2. │                                                                    │
  3. │                          WELCOME TO vbox!                          │
  4. │                                                                    │
  5. └────────────────────────────────────────────────────────────────────┘' | awk -vhostname="xxxxxxxxxxxxxxxxxxxxxxxxxxx" '/WELCOME/{len=length($0);sub("vbox", hostname, $4);new_text_len=length($2)+length($3)+length($4)+3;space_len=int((len-length($1)-length($5)-new_text_len)/2);printf "%s%"space_len"s %s %s %s%"space_len"s%s\n", $1, "", $2, $3, $4, "", $5; next}1'┌────────────────────────────────────────────────────────────────────┐
  6. │                                                                    │
  7. │               WELCOME TO xxxxxxxxxxxxxxxxxxxxxxxxxxx!              │
  8. │                                                                    │
复制代码

作者: liion631818    时间: 2015-04-26 10:46
本帖最后由 liion631818 于 2015-04-26 10:47 编辑

回复 1# bikkuri
  1. awk -vhostname=$(hostname) '/WELCOME/{rep_len=length(hostname);sub("vbox", hostname, $0); for(i=0; i<rep_len-4;i++)sub(" ", "", $0);}1'
复制代码

作者: bikkuri    时间: 2015-04-26 11:01
谢谢您的回复,不过结果好像不正确。



liion631818 发表于 2015-04-26 10:46
回复 1# bikkuri

作者: liion631818    时间: 2015-04-26 11:16
回复 3# bikkuri


  改了,用新的试试
作者: liion631818    时间: 2015-04-26 11:24
前面也有问题,忘记int取整后对奇数需要补1了,下面是最新的
  1. $ echo '┌────────────────────────────────────────────────────────────────────┐
  2. │                                                                    │
  3. │                          WELCOME TO vbox!                          │
  4. │                                                                    │
  5. └────────────────────────────────────────────────────────────────────┘' | awk -vhostname="xxxxxxxxxxxxxxxxxxxxxxxxxx1x" '/WELCOME/{len=length($0);sub("vbox", hostname, $4);new_text_len=length($2)+length($3)+length($4)+3;space_len=((len-length($1)-length($5)-new_text_len)/2);add_one=0;if(space_len!=int(space_len))add_one=1;printf "%s%"space_len"s %s %s %s%"space_len+add_one"s%s\n", $1, "", $2, $3, $4, "", $5;next}1'
  6. ┌────────────────────────────────────────────────────────────────────┐
  7. │                                                                    │
  8. │              WELCOME TO xxxxxxxxxxxxxxxxxxxxxxxxxx1x!              │
  9. │                                                                    │
  10. └────────────────────────────────────────────────────────────────────┘
复制代码

作者: bikkuri    时间: 2015-04-26 12:15
本帖最后由 bikkuri 于 2015-04-26 12:46 编辑

好像还是不行。
文本不是顶头写的,前面还有一些空格。


liion631818 发表于 2015-04-26 11:24
前面也有问题,忘记int取整后对奇数需要补1了,下面是最新的

作者: songyc_2015    时间: 2015-04-26 14:02
  1. awk -vh="1111111111111111111111" -vj="5" '
  2.     FNR==1{l=length()}
  3.     $1~/^┌/||$1~/^└/{s=sprintf("%*s",l,$1);$0=s} #head and tail line
  4.     /WEL/{s=$2" "$3" "h"!";w=length(s);z=int((l-j-2-w)/2);y=sprintf("%*s%*s%*s",j+1,$1,z+w,s,w%2?z+2:z+1,$NF);$0=y} #welcode line
  5.     $1~/^\|/&&$0!~/WEL/{s=sprintf("%*s%*s",j+1,$1,l-j-1,$NF);$0=s} #the other line
  6. 1' d.txt
复制代码

作者: liion631818    时间: 2015-04-26 20:42
开始不说清楚....回复 7# bikkuri


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2