除了bash中的第一个单词之外,字符串的顺序

时间:2017-07-25 07:57:54

标签: bash shell awk sed

我试图颠倒在最终输出中排除第一个单词的单词的顺序。例如,我有一个单词/etc/nginx/sites-enabled/我使用此命令来颠倒顺序

db.in.com.example

我想在输出中排除最后$ basename db.in.com.example | awk -F'.' '{ for (i=NF; i>1; i--) \ printf("%s.",$i); print $1; }' example.com.in.db 。喜欢这个

.db

我遇到了麻烦。这可以仅使用example.com.in 来完成吗?有人可以帮我吗?

5 个答案:

答案 0 :(得分:4)

$ echo db.in.com.example | awk -F. '{      # set . as delimiter
    for(i=NF;i>1;i--)                      # loop from last to next-to-first
        printf "%s%s", $i, (i==2?ORS:".")  # output item and ORS or . after next-to-first
}'
example.com.in

答案 1 :(得分:2)

如果perl没问题

$ echo 'db.in.com.example' | perl -F'\.' -lane 'print join ".", reverse(@F[1..$#F])'
example.com.in
$ echo '1.2.3.db.in.com.example' | perl -F'\.' -lane 'print join ".", reverse(@F[2..$#F])'
example.com.in.db.3
  • -F'\.'.设置为输入字段分隔符并保存到@F数组
  • reverse(@F[1..$#F])会提供从索引1到最后一个索引的反向数组元素
    • 同样,@F[2..$#F]将排除第一和第二个元素
  • join "."添加.作为数组
  • 元素之间的分隔符
  • 有关命令行选项的详细信息,请参阅http://perldoc.perl.org/perlrun.html#Command-Switches

答案 2 :(得分:1)

您可以使用cuttac和参数扩展:

reverse=$(basename db.in.com.example |
    cut -d. -f2- --output-delimiter=$'\n' |
    tac )
echo ${reverse//$'\n'/.}

答案 3 :(得分:1)

你在这里得到了一些不错的答案。我正在添加一个在我看来更具可读性的,当然如果ruby是你的选择:

$ echo "db.in.com.example" | ruby -ne 'p ($_.strip.split(".").drop(1).reverse.join("."))' 
"example.com.in"

答案 4 :(得分:0)

尝试跟随一次,这将反转文本,它允许你从输出中删除任何字符串,不仅仅是db,你只需要更改变量的值,它就应该飞行了。

echo "db.in.com.example" | awk -v var="db" -F"." '{for(i=NF;i>0;i--){val=$i!=var?(val?val FS $i:$i):val};print val;val=""}'

编辑:现在也添加非单行形式的解决方案。

echo "db.in.com.example" | awk -v var="db" -F"." '{
  for(i=NF;i>0;i--){
  val=$i!=var?(val?val FS $i:$i):val
  }
  print val;val=""
}'