如何使用sed动态替换行中特定位置字符?

希望编写一个shell脚本实现对一个单行长数据串按照指定列宽自动换行显示
例如:
1)先产生一个单行长字符串
$ primes 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
2)令这个数据串按照每行十列显示
$ primes 100 | sed 's/\t/\n/10;s/\t/\n/19'
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97

打算使用for语句实现对行中特定位置的制表符"\t"进行替换
Number=`wc -w $1 | awk '{print $1}'`
for i in `seq 10 10 $Number`
do
j=0
sed 's/\t/\n/$(($i-$j))' $1
let j+=1
done
但是sed不支持在替换命令中使用变量指定替换字符出现的次数! [囧]
请教该如何处理?使用sed或者awk都行

如果只追求结果,我建议使用其它命令——比如 pr

primes 0  1000  |  pr   -t   -10

输出结果如下:


如果要用sed,或 awk,估计要费点脑筋。

追问

不给参数$1时提示:行3:/8:语法错误: 需要操作数 (错误符号是 "/8")

没看出有啥错啊? 求指点:D

追答

你 if 语句中,如果$1为空,则COLUMNS除以8。但COLUMNS没有初始化——没有赋值,所以出现“空/8”。

COLUMNS是shell变量,不是全局的“环境变量”,所以脚本中子进程不能直接继承。

可以使用tput命令获得终端的尺寸。

也可以在脚本开头的声明中,使用
#!/bin/bash -i
将脚本运行环境设置为interactive shell,就可以使用shell变量——COLUMNS了。不过,更推荐第一种方法。

你好,我重新看了一下提问时,你写的脚本,我按照你的思路,修改了下脚本。由于不能使用附件,只有截图了。

温馨提示:答案为网友推荐,仅供参考
相似回答