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

2015-11-21 21:53:22 +08:00
 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 的开头部分,求各位大大解答如何解决
3701 次点击
所在节点    Linux
6 条回复
xuyinan503
2015-11-21 23:03:30 +08:00
test.xml 啥内容
fnmsd
2015-11-21 23:05:15 +08:00
@xuyinan503
<root>
<name>test</name>
</root>
xuyinan503
2015-11-21 23:10:44 +08:00
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 23:13:59 +08:00
覆盖掉开头部分什么意思?
正常应该输出
test
test:123456
Arthur2e5
2015-11-22 01:14:34 +08:00
是不是因为 Windows CRLF 所以被 $line 里的 \r 干了?
Arthur2e5
2015-11-22 02:18:05 +08:00
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://www.v2ex.com/t/237935

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

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

© 2021 V2EX