分页: 1 / 1

【求助】 文本处理之自动产生字符串'........'(已解)

发表于 : 2012-03-16 14:00
halfwolf
【求助】 文本处理之自动产生字符串'........'

在脚本运行过程中经常需要打印如下分割符号
............................................................................
---------------------------------------------------------
==================================
++++++++++++++++++++++++++++++++++
######################################

以前用的办法是
div=”............................................................................”

需要的时候
echo $div

这种方法的缺点:如果想美观,需要人工去数基本元素(.-=+#)的个数,由于本人最近既笨又懒,因此,想寻找一种通用做法,譬如定义
1、dotnum=45
2、用”.”和$dotnum处理得到$div<此处征集处理办法>
3、echo $div
得到和上面一样的效果。

请高手帮忙,谢谢!

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-16 14:03
枫叶饭团
写一个循环函数吧

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-16 14:10
halfwolf
谢谢!


#!/bin/bash

dotnum=45
dottype='.'
div=''

for i in `seq 1 $dotnum`
do
div=${dottype}$div
done
echo $div

:em04

有没有更优雅的办法?

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-16 14:12
枫叶饭团
要是python的话直接*。。。

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-16 14:46
aerofox
可以定义一个函数,这个函数应该不难,不多说。

如果宽度是确定的,变化的是符号,可以开始时定义其中一个,比如

代码: 全选

div=.............................................
然后在需要时换成别的字符显示:

代码: 全选

echo ${div//./#}
如果符号是确定不变的,宽度要变,可以选子串显示:

代码: 全选

echo ${div:0:20}
如果二者都变,那么就可以综合上面两步:

代码: 全选

spaces=$(printf "%80s" " ")    # 定义一个足够长的字符串当作模板
div=${spaces:0:45}
echo ${div// /.}

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-16 15:16
halfwolf
谢谢!

函数法

#!/bin/bash

function div(){

dotnum=$2
dottype=$1
div=''

for i in `seq 1 $dotnum`
do
div=$dottype$div
done
echo $div
}

div . 45
div - 45
div + 45
div = 45
div '&' 45
div '#' 45

:em06

应该有单行解决方案!呵呵

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-16 15:37
aerofox
函数法已经应该算是单行解决方案了,因为函数只需要定义一次,使用时是单行的。

表面上的单行未必是好的办法,例如下面也是单行的办法,但显然效率不高:

代码: 全选

dd if=/dev/zero bs=$dotnum count=1 2> /dev/null | sed 's/././g;s/$/\n/'

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-16 19:51
naturalaw
我倾向于使用函数,模块化。

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-16 19:53
月下叹逍遥
上循环

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-17 20:08
fnan
n=15;c='*';sed -r "s/[^ ]+ ?/$c/g" <<<$(seq $n)
#方案之一。
n=3;c='*';div=$(seq -s$c $n|tr -d 0-9)$c;echo "$div"
n=3;c='*';echo "$(seq -s$c $n|tr -d 0-9)$c"

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-17 20:58
Strange
如果是linux下的脚本,上perl吧,反正各种linux标配

代码: 全选

perl -e "print '-' x 80"

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-17 21:58
lilydjwg
Strange 写了:如果是linux下的脚本,上perl吧,反正各种linux标配

代码: 全选

perl -e "print '-' x 80"

代码: 全选

python3 -c 'print("-" * 80)'

代码: 全选

ghc -e "putStrLn $ replicate 80 '-'"

代码: 全选

ruby -e 'puts "-" * 80'
Ruby 的乘号两边的操作数不能反过来,Python 的可以。

Re: 【求助】 文本处理之自动产生字符串'........'

发表于 : 2012-03-19 14:42
halfwolf
谢谢诸位,我试着解读一下,见笑了

fnan兄弟的方法主要由两部分构成(譬如我打印45个*,则可用seq -s'*' 0 45|tr -d 0-9),如下

1、seq -s'*' 0 45
0*1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25*26*27*28*29*30*31*32*33*34*35*36*37*38*39*40*41*42*43*44*45

2、tr -d 0-9 即删除数字部分
*********************************************

还有一种办法与fnan兄弟的方法有异曲同工之妙,如下
printf '*%.0s' {1..45}
{1..45} 重复打印,循环送入1,2,……,45的数字;
%.0s 按字符打印,字符宽度为0;

Strange兄弟和lilydjwg兄弟的perl/python/ghc/ruby解法更加简洁明了,已收下,谢谢!

Re: 【求助】 文本处理之自动产生字符串'........'(已解)

发表于 : 2012-03-19 21:29
fnan
printf "%c" '*'{1..45}
#异曲同工。

Re: 【求助】 文本处理之自动产生字符串'........'(已解)

发表于 : 2012-03-20 21:40
lilydjwg
再来个 zsh 版的:

代码: 全选

print -- ${(l.80..-.)}
l 标志表示进行左对齐。这里没有给出参数(parameter),因此它将空字符串按 80 字符左对齐,以「-」填充。