大家好,我有一个字符串,我想从中提取一个子字符串。问题是起始位置存储在变量中。AWK 似乎无法识别该变量。
以下是代码
str="This is a test"
s1="is"
i=$(awk -v a="$str" -v b="$s1" 'BEGIN{print index(a,b)}')
echo "$str" | awk '{print substr($0,$i)}'
但这不起作用。如何强制 awk 识别i
?
答案1
和 狂欢:
awk -v value="$i" '{print substr($0,value)}' <<< "$str"
答案2
变量未被传递到awk
。而是
echo "$str" | awk '{print substr($0,$i)}'
做
echo $str | awk -v i="$i" '{print substr($0,i)}'
然而,输出是
% ./a.sh
is is a test
您的预期输出是什么?
答案3
为什么不在一次 awk 调用中完成所有处理?
haystack="This is a test"
needle="is"
printf '%s\n' "$haystack" | awk -v "needle=$needle" '{
i=index($0, needle)
if (i) print substr($0, i)
}'
如果您需要您的 shell 脚本也看到 的值i
,您可以> "/dev/tty"
在上面的命令末尾添加print
,然后添加另一行仅仅print i
没有重定向,然后将整printf ... | awk ...
行包装在一个i=$(...)
构造中。
答案4
直接回答原始问题:通过转义引号并让 shell 扩展变量:
awk '{print substr($0,'$i')}'
如果怀疑变量可能包含空格和其他内容,并且希望在 awk 中将其视为字符串,则可以使用更多引号:
awk '{print index($0,"'"$s1"'")}'
...但如果遇到这种情况,人们往往会做一些不太理想的事情:-)。