【问题标题】:unix tr find and replaceunix tr 查找和替换
【发布时间】:2012-01-11 02:17:20
【问题描述】:

这是我在标准网页上使用的命令,我来自网站 wget

tr '<' '\n<' < index.html

但是它给了我换行符,但没有再次添加左侧中断。 例如

 echo "<hello><world>" | tr '<' '\n<'

返回

 (blank line which is fine)
 hello>
 world>

而不是

 (blank line or not)
 <hello>
 <world>

怎么了?

【问题讨论】:

    标签: unix sed awk tr


    【解决方案1】:

    那是因为tr 只进行逐字符替换(或删除)。

    改用sed

    echo '<hello><world>' | sed -e 's/</\n&/g'
    

    awk

    echo '<hello><world>' | awk '{gsub(/</,"\n<",$0)}1'
    

    perl

    echo '<hello><world>' | perl -pe 's/</\n</g'
    

    ruby

    echo '<hello><world>' | ruby -pe '$_.gsub!(/</,"\n<")'
    

    python

    echo '<hello><world>' \
    | python -c 'for l in __import__("fileinput").input():print l.replace("<","\n<")'
    

    【讨论】:

    • 我试过了,但我得到了 nn。我不知道 sed 换行符是什么
    • @Kamran224 这对我有用,但请尝试: echo -e '' | sed -e 's/\n&/g'
    • @ephemient SunOS(我校园的afs系统)
    • @Jaypal 8 个空格的字符串不等于制表符;你需要一个文字制表符。 8 个空格是关于制表位的,而不是制表符。
    • 在未指定的 Unix 机器上使用 perl。在这些机器上使用sedtr 可以表明它们不支持预期的功能。
    【解决方案2】:

    这对你有用吗?

    awk -F"><" -v OFS=">\n<" '{print $1,$2}'
    
    [jaypal:~/Temp] echo "<hello><world>" | awk -F"><" -v OFS=">\n<" '{$1=$1}1';
    <hello>
    <world>
    

    您可以在 awk {} 操作前面放置一个正则表达式 //(您希望发生这种情况的行)。

    【讨论】:

    • '{$1=$1}1' 更短,如果一行中有多个 &gt;&lt; 则可以使用。
    • 这将替换比问题中更少的&lt; 字符。
    【解决方案3】:

    如果你有 GNU grep,这可能对你有用:

    grep -Po '<.*?>[^<]*' index.html
    

    它应该通过所有的 HTML,但是每个标签应该从行首开始,可能的非标签文本在同一行之后。

    如果你只想要标签:

    grep -Po '<.*?>' index.html
    

    不过,您应该知道,使用正则表达式解析 HTML 是 not a good idea

    【讨论】:

      【解决方案4】:

      放置换行符的顺序很重要。您也可以转义“

      `tr '<' '<\n' < index.html` 
      

      同样有效。

      【讨论】:

        猜你喜欢
        • 2012-04-28
        • 2016-03-18
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 2012-12-26
        • 2012-12-29
        • 1970-01-01
        • 2012-09-22
        相关资源
        最近更新 更多