奇怪的bash结果使用cut

时间:2014-11-03 11:17:09

标签: bash ubuntu cut

我正在尝试运行此命令:

./smstocurl SLASH2.911325850268888.911325850268896

smstocurl脚本:

#SLASH2.911325850268888.911325850268896
model=$(echo \&model=$1 | cut -d'.' -f 1)
echo $model
imea1=$(echo \&simImea1=$1 | cut -d'.' -f 2)
echo $imea1
imea2=$(echo \&simImea2=$1 | cut -d'.' -f 3)
echo $imea2
echo $model$imea1$imea2

收到结果

&model=SLASH2911325850268888911325850268896

结果预期

&model=SLASH2&simImea1=911325850268888&simImea2=911325850268896

我在这里缺少什么?

3 个答案:

答案 0 :(得分:4)

cut基于点.。在第一种情况下,您想要的字符串包含第一个字符串,即包含&model的字符串,然后打印出来。

但是,在其他情况下,您会获得第2和第3个区块(-f2-f3),以便imea文字被删除。

相反,我会使用这样的东西:

while IFS="." read -r model imea1 imea2
do
    printf "&model=%s&simImea1=%s&simImea2=%s\n" $model $imea1 $imea2
done <<< "$1"

请注意使用printf和变量来更好地控制我们正在编写的内容。使用像echo这样的大量逃脱可能会有风险。

测试

while IFS="." read -r model imea1 imea2; do printf "&model=%s&simImea1=%s&simImea2=%s\n" $model $imea1 $imea2
done <<< "SLASH2.911325850268888.911325850268896"

返回:

&model=SLASH2&simImea1=911325850268888&simImea2=911325850268896

或者,这个sed使它成为:

sed -r 's/^([^.]*)\.([^.]*)\.([^.]*)$/\&model=\1\&simImea1=\2\&simImea2=\3/' <<< "$1"

通过捕捉由点分隔的每个单词块并打印回来。

答案 1 :(得分:1)

你也可以这样使用

生成

./program SLASH2.911325850268888.911325850268896

<强>脚本:

#!/bin/bash
String=`echo $1 | sed "s/\./\&simImea1=/"`
String=`echo $String | sed "s/\./\&simImea2=/"`
echo "&model=$String

<强>输出:

&model=SLASH2&simImea1=911325850268888&simImea2=911325850268896

答案 2 :(得分:1)

awk way

awk -F. '{print "&model="$1"&simImea1="$2"&simImea2="$3}' <<< "SLASH2.911325850268888.911325850268896"

awk -F. '$0="&model="$1"&simImea1="$2"&simImea2="$3' <<< "SLASH2.911325850268888.911325850268896"

输出

&model=SLASH2&simImea1=911325850268888&simImea2=911325850268896