我需要在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
在"."上拆分字符串并反转数组。使用"."加入反向数组。