测试人社区

抽奖脚本中空格替换的问题

[92940814@shell.testing-studio.com ~]$cat name1.txt | sed 's/ /../g'
张三
李四
王五
....
赵..六
[92940814@shell.testing-studio.com ~]$while read line;do echo ${line// /..};done < name1.txt
张三
李四
王五

赵..六

第二种为什么没有把第四行中的两个空格替换成"…"

其实名字前后都有空格时,第二种方式也无法处理,我个人是按如下方式处理的,以供参考。
local seeds=while read line;do echo $(sed 's/ /../g');done < wx.txt

echo ${line// /…},这种使用方式具体如何替代的,查了也没搞明白,个人决定弃用。

你这个写法会导致第一行丢失的

感觉最佳的应该这样写吧:

while read line;do if [ "$line" ];then echo ${line// /..};else echo ..;fi;done < name1.txt

read line的时候会去掉首尾的空格,但空值的变量还是保留了,所以感觉多余的那个空格实际上是一个\n
简写如下:

while read line;do [ "$line" ]&&echo ${line// /..}||echo ..;done < name1.txt

@ytq12875 谢谢助教,你真细心,处理缺失一行都被你发现了。
我自己做了一个文本,里面含有名字,分为几种情况:名字前后中都带有空格,也就是说前后中的空格视为名字的一部分要保留,基于这个前提去实现的。

read按行读文件会自动丢失文件中制表符和行首尾空格。 read -r可保留制表符。但是行前后空格还是会丢失。

所有行均被处理,但是如果一个名字前后都空格,即前后空格是名字的一部分,则该名字的前后空格在read line会被去掉。

local seeds=`while read -r line;do echo "$line" | sed 's/ /../g';done < wx.txt`

名字前中后都有空格,如果要保留,其实可以直接这样处理。

local seeds=`sed 's/ /../g' wx.txt`

这个方法是可行的,MD语法代码使用的“```” 三个飘号开始 三个飘号结束

谢谢助教,搞定了 :blush:

这个第一行丢失的原理是什么?没太看懂

local seeds= `while read line;do echo $(sed 's/ /../g');done < wx.txt`
local seeds=`while read -r line;do echo "$line" | sed 's/ /../g';done < wx.txt`

read -r line,-r加不加都可以,其实就是echo后多加了"$line",这就明确指出对指定内容进行替换,不加呢就从第二行替换。问题就在这。
如果想深入学习,有书讲的很系统,极客上我看了也有老师讲,应该也比较深入。如果有兴趣,可以深入学习。