【问题标题】:Print a string separated by dots in reverse order [closed]以相反的顺序打印由点分隔的字符串[关闭]
【发布时间】:2016-09-25 06:21:05
【问题描述】:

我需要在 bash shell 中以相反的顺序打印一个字符串。

[deeps@host1:~]echo maps.google.com|rev
moc.elgoog.spam
[deeps@host1:~]

但我需要它作为“com.google.maps”。对于以句点分隔的任何字符串(.),我通常需要它。

它应该以相反的顺序打印。我该怎么做?

我也需要 Perl 中的解决方案。

【问题讨论】:

    标签: linux string bash perl shell


    【解决方案1】:

    . 拆分,然后反转结果,然后再次合并。

    Perl 命令开关:

    -l 表示“从输入/输出中删除/添加换行符”。

    -p 表示“对每一行输入执行程序,并在每次执行后打印$_。”

    -e 表示“以下参数是要运行的程序的代码。”

    perldoc perlrun 了解更多详情。

    echo maps.google.com | perl -lpe '$_ = join ".", reverse split /\./;'
    

    输出

    com.google.maps
    

    如果您有一个包含很多行的数据文件,它也可以工作。

    输入

    maps.google.com
    translate.google.com
    mail.google.com
    

    运行

    perl -lpe '$_ = join ".", reverse split /\./;' input
    

    输出

    com.google.maps
    com.google.translate
    com.google.mail
    

    【讨论】:

    • 使用-l 避免chompprint "\n"
    • 谢谢@hobbs。已更新。
    • 感谢@ikegami 的更新。
    【解决方案2】:

    使用一堆实用程序

    $ tr '.' $'\n' <<< 'maps.google.com' | tac | paste -s -d '.'
    com.google.maps
    

    这会用换行符 (tr) 替换所有句点,然后反转行的顺序 (tac),然后连续粘贴行 (paste -s),句点作为分隔符 (-d '.') .

    pure Bash 中相当丑陋(或者只是冗长?):

    # Read string into array 'arr', split at periods by setting IFS
    IFS=. read -a arr <<< 'maps.google.com'
    
    # Loop over array from the end
    for (( i = $(( ${#arr[@]}-1 )); i >= 0; --i )); do
    
        # Append element plus a period to result string
        res+=${arr[i]}.
    done
    
    # Print result string minus the last period
    echo "${res%.}"
    

    【讨论】:

      【解决方案3】:
      $ echo maps.google.com | awk -F. '{for (i=NF;i>0;i--) printf "%s%s",$i,(i==1?"\n":".")}'
      com.google.maps
      

      工作原理

      • -F.

        这告诉 awk 使用句点作为字段分隔符

      • for (i=NF;i&gt;0;i--) printf "%s%s",$i,(i==1?"\n":".")

        这将遍历所有字段,从最后一个开始,以第一个结束并打印它们,后跟一个句点(第一个字段后面跟一个换行符除外)。

        上面一个棘手的部分是(i==1?"\n":".")。这称为三元语句? 之前的部分是一个逻辑条件。如果条件为真,则使用问号之后但: 之前的值。如果为 false,则使用 : 之后的值。在这种情况下,这意味着,当我们在第一个字段i==1 上时,语句将返回一个换行符\n。如果我们在任何其他字段上,它会返回一个句点,.。我们使用它在除第一个字段(在输出中最后打印)之外的所有字段之后放置一个句点。在它之后,我们添加一个换行符。

        有关三元语句的更多信息,请参阅GNU docs

      【讨论】:

      • 能否请您告诉我 '(i==1?"\n":".")' 是如何工作的?
      • @deeps 好点。我为三元语句添加了解释和文档链接。
      • 感谢@john1024 的详细解释
      【解决方案4】:

      Perl 中的解决方案:

      $str = "maps.google.com";
      @arr =split('\.',$str);
      print join(".",reverse @arr);
      

      输出:

      com.google.maps

      在“.”上分割字符串并反转数组。使用“.”连接反转数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-20
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 2016-02-17
        • 2021-08-17
        • 1970-01-01
        相关资源
        最近更新 更多