求助 关于 linux shell 编程输出的问题 echo 与 sed 结合使用字符串发生覆盖

2015 年 11 月 21 日
 fnmsd
写了大概这么个东西,为了读 XML 文件并且加点东西:
#!/bin/sh
sed -n 's/.*>\(.*\)<\/name>/\1/p' test.xml|while read line
do
echo $line
echo $line:123456
done

结果输出时候单 echo $line 没有问题,但是第二个 echo , 123456 的部分覆盖掉了$line 的开头部分,求各位大大解答如何解决
4440 次点击
所在节点    Linux
6 条回复
xuyinan503
2015 年 11 月 21 日
test.xml 啥内容
fnmsd
2015 年 11 月 21 日
@xuyinan503
<root>
<name>test</name>
</root>
xuyinan503
2015 年 11 月 21 日
xuyinan@xuyinan:~$ cat test.xml
<root>
<name>test</name>
</root>
xuyinan@xuyinan:~$ cat test.sh
#!/bin/sh
sed -n 's/.*>\(.*\)<\/name>/\1/p' test.xml|while read line
do
echo $line
echo $line:123456
done
xuyinan@xuyinan:~$ ./test.sh
test
test:123456
xuyinan@xuyinan:~$

实测 ubuntu 正常
RickyBoy
2015 年 11 月 21 日
覆盖掉开头部分什么意思?
正常应该输出
test
test:123456
Arthur2e5
2015 年 11 月 22 日
是不是因为 Windows CRLF 所以被 $line 里的 \r 干了?
Arthur2e5
2015 年 11 月 22 日
echo 之前加一个 `line=${line%$'\r'}` 去掉 CR 就好了。

其实你完全用不着 sed :

```Bash
while IFS='' read -r -u 4 line; do
[[ $line =~ <name>(.*)</name> ]] || continue
printf '%s\n' "${BASH_REMATCH[1]}:123456"
done
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/237935

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX