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



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

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

但我需要它作为"com.google.maps"。我通常需要它用于任何由句点(.)分隔的字符串。

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

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

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

Perl命令开关:

CCD_ 3表示";从输入/输出中删除/添加换行符">

CCD_ 4表示";针对每一行输入执行程序并且在每次执行之后打印$_">

CCD_ 6表示";以下参数是要运行的程序的代码">

perldocperlrun了解更多详细信息。

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

使用一堆util

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

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

纯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%.}"
$ 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":".")。这被称为三元语句?之前的部分是一个逻辑条件。如果条件为true,则使用问号之后但:之前的值。如果为false,则使用:之后的值。在这种情况下,这意味着,当我们在第一个字段i==1上时,该语句返回一个换行符n。如果我们在任何其他字段上,它会返回一个周期.。我们用它在所有字段后面加一个句点,除了第一个字段(在输出中,它是最后打印的)。在它之后,我们放了一条换行符。

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

Perl解决方案:

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

输出:

com.google.maps

在"."上拆分字符串并反转数组。使用"."加入反向数组。

相关内容

  • 没有找到相关文章

最新更新