V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
fnmsd
V2EX  ›  Linux

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

  •  
  •   fnmsd · Nov 21, 2015 · 4551 views
    This topic created in 3823 days ago, the information mentioned may be changed or developed.
    写了大概这么个东西,为了读 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 的开头部分,求各位大大解答如何解决
    6 replies    2015-11-22 02:18:05 +08:00
    xuyinan503
        1
    xuyinan503  
       Nov 21, 2015
    test.xml 啥内容
    fnmsd
        2
    fnmsd  
    OP
       Nov 21, 2015
    @xuyinan503
    <root>
    <name>test</name>
    </root>
    xuyinan503
        3
    xuyinan503  
       Nov 21, 2015
    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
        4
    RickyBoy  
       Nov 21, 2015
    覆盖掉开头部分什么意思?
    正常应该输出
    test
    test:123456
    Arthur2e5
        5
    Arthur2e5  
       Nov 22, 2015
    是不是因为 Windows CRLF 所以被 $line 里的 \r 干了?
    Arthur2e5
        6
    Arthur2e5  
       Nov 22, 2015
    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
    ```
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1034 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 18:29 · PVG 02:29 · LAX 11:29 · JFK 14:29
    ♥ Do have faith in what you're doing.