如何使用 awk 方法在 bash 脚本上实现 startsWith 函数
How to use awk method to implement the startsWith function on bash script
我正在尝试使用 awk 在 bash 脚本中实现 startsWith 函数,但它不起作用。
https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
#! /bin/bash
starts_with()
{
local string=
local substring=
local index=$(printf "%s" "$string" | awk 'BEGIN { print index("$string", "$substring") }')
if [[ "$index" == "1" ]]
then
echo "true" : $string : $substring
else
echo "false" : $string : $substring
fi
}
starts_with key1="value" key1=
starts_with key2="value" wrong_key=
这是输出:
false : key1=value : key1=
false : key2=value : wrong_key=
但是 awk 页面说:
index(in, find)
Search the string in for the first occurrence of the string find, and return the position in characters where that occurrence begins in the string in. Consider the following example:
$ awk 'BEGIN { print index("peanut", "an") }'
-| 3
If find is not found, index() returns zero.
With BWK awk and gawk, it is a fatal error to use a regexp constant for find. Other implementations allow it, simply treating the regexp constant as an expression meaning ‘[=13=] ~ /regexp/’. (d.c.)
上面的starts_with
函数有什么问题,如何解决?
如果可以直接在 bash?
中使用 awk
就没有意义了
#!/bin/bash
starts_with() {
local string=""
local substring=""
if [[ $string == "$substring"* ]]
then
echo "true : $string : $substring"
else
echo "false : $string : $substring"
fi
}
awk 'BEGIN { print index("$string", "$substring") }'
你不能在 GNU AWK
命令中像这样使用你的 shell 变量考虑简单的例子
string="HELLOWORLD" && awk 'BEGIN{print "$string"}' emptyfile.txt
输出
$string
观察文字 $string
出现,如果你想将 shell 中浮动的变量 ram 到 GNU AWK
命令中,例如使用 -v
string="HELLOWORLD" && awk -v s=$string 'BEGIN{print s}' emptyfile.txt
输出
HELLOWORLD
(在 GNU Awk 5.0.1 中测试)
如果您不介意额外输入,也可以将其导出:
export string="HELLOWORLD" && mawk '
BEGIN {
print ENVIRON["string"]
}'
HELLOWORLD
如果你不想导出,我想这也行
% string2="HELLOWORLD" mawk '
BEGIN{
print ENVIRON["string2"]
}' | gtee >( gpaste - \
\
| gsed -zE 's/^/ orig from pipe :: /' >&2;) | gcat -n
1 HELLOWORLD
orig from pipe :: HELLOWORLD
我不知道 Linux 和其他人的剪贴板机制是如何工作的,但如果你碰巧在 macOS
上,而你想引入的 shell 变量是不要太复杂,这是另一种方法:
pbcopy <<<"${TERM_SESSION_ID}" ;
mawk 'BEGIN {
(__=" pbpaste ") | getline _;
close(__)
print "pasting via macos clipboard ::", (_) }' | lgp3
pasting via macos clipboard :: BEC24EEE-B6B3-4862-A286-1953FB6438A7
如果您希望 getline
是单个语句,那么也许
mawk ' BEGIN {
printf(" pasting via macos clipboard :: %*s",
close((__="pbpaste")|getline _)<"",_)
}' | lgp3
pasting via macos clipboard :: BEC24EEE-B6B3-4862-A286-1953FB6438A7
我正在尝试使用 awk 在 bash 脚本中实现 startsWith 函数,但它不起作用。
https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
#! /bin/bash
starts_with()
{
local string=
local substring=
local index=$(printf "%s" "$string" | awk 'BEGIN { print index("$string", "$substring") }')
if [[ "$index" == "1" ]]
then
echo "true" : $string : $substring
else
echo "false" : $string : $substring
fi
}
starts_with key1="value" key1=
starts_with key2="value" wrong_key=
这是输出:
false : key1=value : key1=
false : key2=value : wrong_key=
但是 awk 页面说:
index(in, find)
Search the string in for the first occurrence of the string find, and return the position in characters where that occurrence begins in the string in. Consider the following example:
$ awk 'BEGIN { print index("peanut", "an") }'
-| 3
If find is not found, index() returns zero.
With BWK awk and gawk, it is a fatal error to use a regexp constant for find. Other implementations allow it, simply treating the regexp constant as an expression meaning ‘[=13=] ~ /regexp/’. (d.c.)
上面的starts_with
函数有什么问题,如何解决?
如果可以直接在 bash?
中使用awk
就没有意义了
#!/bin/bash
starts_with() {
local string=""
local substring=""
if [[ $string == "$substring"* ]]
then
echo "true : $string : $substring"
else
echo "false : $string : $substring"
fi
}
awk 'BEGIN { print index("$string", "$substring") }'
你不能在 GNU AWK
命令中像这样使用你的 shell 变量考虑简单的例子
string="HELLOWORLD" && awk 'BEGIN{print "$string"}' emptyfile.txt
输出
$string
观察文字 $string
出现,如果你想将 shell 中浮动的变量 ram 到 GNU AWK
命令中,例如使用 -v
string="HELLOWORLD" && awk -v s=$string 'BEGIN{print s}' emptyfile.txt
输出
HELLOWORLD
(在 GNU Awk 5.0.1 中测试)
如果您不介意额外输入,也可以将其导出:
export string="HELLOWORLD" && mawk '
BEGIN {
print ENVIRON["string"]
}'
HELLOWORLD
如果你不想导出,我想这也行
% string2="HELLOWORLD" mawk '
BEGIN{
print ENVIRON["string2"]
}' | gtee >( gpaste - \
\
| gsed -zE 's/^/ orig from pipe :: /' >&2;) | gcat -n
1 HELLOWORLD
orig from pipe :: HELLOWORLD
我不知道 Linux 和其他人的剪贴板机制是如何工作的,但如果你碰巧在 macOS
上,而你想引入的 shell 变量是不要太复杂,这是另一种方法:
pbcopy <<<"${TERM_SESSION_ID}" ;
mawk 'BEGIN {
(__=" pbpaste ") | getline _;
close(__)
print "pasting via macos clipboard ::", (_) }' | lgp3
pasting via macos clipboard :: BEC24EEE-B6B3-4862-A286-1953FB6438A7
如果您希望 getline
是单个语句,那么也许
mawk ' BEGIN {
printf(" pasting via macos clipboard :: %*s",
close((__="pbpaste")|getline _)<"",_)
}' | lgp3
pasting via macos clipboard :: BEC24EEE-B6B3-4862-A286-1953FB6438A7