我需要在bash shell中以相反的顺序打印一个字符串。
f
但我需要它作为“com.google.maps”。对于以句点([deeps@host1:~]echo maps.google.com|rev
moc.elgoog.spam
[deeps@host1:~]
)分隔的任何字符串,我通常需要它。
它应该以相反的顺序打印。我该怎么做?
我也需要Perl中的解决方案。
答案 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;。