以相反的顺序打印由点分隔的字符串

时间:2016-05-27 03:48:26

标签: linux string bash perl shell

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

f

但我需要它作为“com.google.maps”。对于以句点([deeps@host1:~]echo maps.google.com|rev moc.elgoog.spam [deeps@host1:~] )分隔的任何字符串,我通常需要它。

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

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

4 个答案:

答案 0 :(得分:10)

.拆分然后反转结果,然后重新加入。

  

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

答案 1 :(得分:3)

使用一堆utils

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

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

纯粹的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%.}"

答案 2 :(得分:2)

$ 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>0;i--) printf "%s%s",$i,(i==1?"\n":".")

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

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

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

答案 3 :(得分:1)

Perl中的解决方案:

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

输出:

  

com.google.maps

将字符串拆分为&#34;。&#34;并反转数组。使用&#34;加入反转数组。&#34;。