1

如果我有这样的字符串:

The important variable=123 the rest is not important.

我想提取 ksh 中的“123”部分。

到目前为止,我已经尝试过:

print awk ' {substr($line, 20) }' | read TEMP_VALUE

(这20部分只是暂时的,直到我弄清楚如何提取字符串的起始位置。)

但这只是打印awk ' {substr($line, 20) }' | read TEMP_VALUE(尽管这种格式确实适用于这样的代码:)print ${line} | awk '{print $1}' | read SINGLE_FILE

我是否缺少执行此操作的简单命令(即其他语言)?

运行 Solaris 10。

4

6 回答 6

6

您的命令因多种原因而失败:您需要类似的东西

TEMP_VALUE=$(print "$line" | awk '...')

您可以使用 ksh 参数扩展:

line="The important variable=123 the rest is not important."
tmp=${line#*=}   # strip off the stuff up to and including the equal sign
num=${tmp%% *}   # strip off a space and all following the first space
print $num       # ==> 123

在 ksh 手册页中查找“参数替换”。

于 2012-10-04T16:59:25.250 回答
6

我们是否假设我们想要的部分之前的内容总是相同的长度?然后:

echo ${variable:23:3}

还是我们假设我们可以使用=符号的位置和 123 之后的空格作为分隔符?我们知道它总是 3 个字符吗?如果你知道你想要的部分以 and 开头,=长度为 3 个字符:

variable=${variable#*=} # strip off everything up to and including the '=' sign
${variable:0:3} # get the next three characters.

确实需要有关变量长度和结构的更多信息。

如果你只知道你想要任何跟随=到下一个空间的东西,那么格伦的解决方案看起来是正确的。

于 2013-07-26T15:06:06.893 回答
2

(对不起,这个有点晚了!)你打算如何确定“123”是要提取的部分?如果标准只是它是“=”符号之后的第一个字段,您可以这样做:

echo "The important variable=123 the rest is not important."|cut -f2 -d=|cut -f1 -d " "

于 2015-05-12T09:22:35.070 回答
1

使用 sed,内联编辑器:

x='The important variable=123 the rest is not important.'
echo $x | sed "s/.* important variable=\(\d\d\d\) .*/\1

sed 匹配 x 中的字符串:

. s/ 替换命令和测试正则表达式的开始 - .* 匹配任何东西,从零开始的任意次数 - 重要变量 = 完全匹配“重要变量 =”,包括前面的空格 - (\d\d\d) 三个 \d匹配 3 位数字,封闭的转义括号启用反向引用实际匹配的 3 位数字 - .* 一个空格和 .* (任何东西)再次 - / 测试正则表达式结束 - \1 替换字符串

匹配的文本(实际上是所有 $x)将被替换字符串替换,即 $x 中的 3 位数字。

于 2014-06-04T16:18:19.320 回答
0
$ x='The important variable=123 the rest is not important.'
$ print -r -- "${x/*=+([[:digit:]])[[:space:]]*/\1}"
123
于 2012-10-09T16:54:11.490 回答
0

我过去用过这个。

回声“var=123”| awk 'BEGIN{FS="="} {打印 $2}'

然后,如果需要,您也可以使用 $1 符号获取变量。

于 2013-04-28T16:36:01.090 回答