简体   繁体   English

如何在 shell 脚本中使用 sed 的值?

[英]how to use values with sed in shell scripting?

i am trying te write a shell script in alphametic,我正在尝试用字母表编写 shell 脚本,

i have 5 parameters like this我有5个这样的参数

$alphametic 5790813 BEAR RARE ERE RHYME

to get要得到

ABEHMRY -> 5790813

i tried this:我试过这个:

  #!/bin/bash
    echo "$2 $3 $4 $5" | sed  's/ //g ' | sed 's/./&\n/g' | sort -n |  sed '/^$/d' | uniq -i > testing
    paste -sd ''  testing  > testing2 
    sed "s|^\(.*\)$|\1 -> ${1}|" testing2 

but i get error (with the last command sed ), i dont know where is the problem.但我收到错误(使用最后一个命令sed ),我不知道问题出在哪里。

#!/bin/sh

val="$1"

shift

printf '%s' "$@" | awk -v FS='' -v OFS='\n' '{$1=$1}1' | sort -n | uniq | tr -d '\n'

printf " -> %s\n" "$val"

edit: Fixed order in output编辑: output 中的固定顺序

  • shift removes $1 from the arguments. shift从 arguments 中移除$1 $@ will then contain all the arguments but the first one, and the old $2 will then be $1 , $3 will be $2 , etc...然后$@将包含所有 arguments 但第一个,旧的$2将是$1$3将是$2 ,等等...
  • printf '%s' "$@" concatenates all the arguments into a single string printf '%s' "$@"将所有 arguments 连接成一个字符串
  • awk -v FS='' -v OFS='\n' '{$1=$1}1' outputs each character vertically awk -v FS='' -v OFS='\n' '{$1=$1}1'垂直输出每个字符
  • tr -d '\n' removes all \n characters tr -d '\n'删除所有\n字符

remark: I didn't add the -i option to uniq because my OS didn't recognize it.备注:我没有将-i选项添加到uniq因为我的操作系统无法识别它。

One idea using awk for the whole thing:一个想法使用awk来完成整个事情:

arg1="$1"
shift
others="$@"

awk -v arg1="${arg1}" -v others="${others}" '
BEGIN { n=split(others,arr,"")                 # split into into array of single characters
        for (i=1;i<=n;i++)                     # loop through indices of arr[] array
            letters[arr[i]]                    # assign characters as indices of letters[] array; eliminates duplicates
        delete letters[" "]                    # delete array index for "<space>"
        PROCINFO["sorted_in"]="@ind_str_asc"   # sort array by index
        for (i in letters)                     # loop through indices
            printf "%s", i                     # print index to stdout
        printf " -> %s\n", arg1                # finish off line with final string
      }
'

NOTE: requires GNU awk for the PROCINFO["sorted_in"] (to sort the indices of the letters[] array)注意: PROCINFO["sorted_in"]需要GNU awk (对letters[]数组的索引进行排序)

This generates:这会产生:

ABEHMRY -> 5790813

Another approach:另一种方法:

chars=$(printf '%s' "${@:2}" | fold -w1 | sort -u | paste -sd '')
echo "$chars -> $1"

sort's -n does't make sense here: these are letters, not numbers. sort 的-n在这里没有意义:这些是字母,而不是数字。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM