对shell脚本中使用的每个字符串字母执行操作



问题

我想对shell脚本(bin/bash(中使用的字符串的每个字母执行一个命令。在下面提到的情况下,我将向"$@"输入发送中文字符,但字符串中没有空格和分隔符。我正在考虑利用字符串长度,然后访问字符串中每个位置的索引:以下是我目前所拥有的(注意rdef是我创建的自定义命令(

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin/: 
export PATH
for f in "$@"
do
    //need to loop through the input and perform action on each index of the $f variable
    rdef "$f"|awk -F '|' '{ gsub(/^ +| +$/, "", $2); print $2 }'
done

订单的标准输入:

rdef 快乐

订单的标准输出:

Definition of <快乐>: | kuài lè |
happy
merry

更新

尽管另一个问题是相似的,但它不是相同的上下文。例如,在这种情况下,我需要拆分作为参数传递给脚本的字符串。我还需要将拆分字符串应用于一组链接的命令。所有这些都体现了相关问题中未涉及的细微差别。

我试过下面的代码,它似乎对汉字不起作用。当我插入ASCII字符时,命令会执行并返回正确的结果。

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin/: 
export PATH

for f in "$@"
do
    foo="$f"
    for (( i=0; i<${#foo}; i++ )); do
        rdef ${foo:$i:1}|awk -F '|' '{ gsub(/^ +| +$/, "", $2); print $2 }'
    done
done

注:

我的最后一个命令行应该使我能够在每个字母上执行链接到awk的自定义命令:

rdef "$letter-var"|awk -F '|' '{ gsub(/^ +| +$/, "", $2); print $2 }'

有关rdef的更多信息,请访问以下操作系统问题

解决方案

提供的所有解决方案都运行良好。我选择了@kojiro提供的选项,因为他为我指明了需要UTF-8的正确方向。这是一个重要的发现,因为汉字的双字节特性正在破坏循环的执行。

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin/: 
export PATH
LC_CTYPE=UTF-8
x=$1
for ((i=0;i<${#x};i++)); do rdef "${x:i:1}" | awk -F '|' '{ gsub(/^ +| +$/, "", $2); print $2 }'; done

Bash 4内置了子字符串切片:

$ x='红楼梦'
$ for ((i=0;i<${#x};i++)); do echo "${x:i:1}"; done
红
楼
梦

您可以使用awk对每个字母执行一个命令。

echo "XXXXX" 
| awk -v FS="" '{ for( I=1 ; I <= NF ; I++ ){ system( "command " $I ) } }
  • FS="告诉awk每个字符都是一个单独的字段
  • for循环对字符进行迭代并执行命令
  • 您需要将命令替换为要执行的命令

例如:

echo "いい天気ですね " 
| awk -v FS="" '{ for( I=1 ; I <= NF ; I++ ){ system( "echo "x" $I "x"" ) } }'

将显示:

xいx
xいx
x天x
x気x
xでx
xすx
xねx
x x

您将需要一个支持多字节字符的awk。

您也可以使用perl

perl -C -lnE 'say for split //' <<<"红楼梦"

打印

红
楼
梦

您可以使用sed添加缺失的空格,这将使for循环在每个字符上迭代:

for f in $( echo "$*" | sed -e 's/(.)/1 /g' )
do
  ...
done

相关内容

  • 没有找到相关文章

最新更新