我想使用perl
从bash函数中的any given string
和substring
获取index of
。
以下是从perl脚本中获取indexOf值的示例:
https://www.geeksforgeeks.org/perl-index-function/
#!/usr/bin/perl
# String from which Substring
# is to be searched
$string = "Geeks are the best";
# Using index() to search for substring
$index = index ($string, 'the');
# Printing the position of the substring
print "Position of 'the' in the string: $index\n";
Output:
Position of 'the' in the string: 10
这里是test.sh:
#!/bin/bash
bash_function_get_index_from_perl_script() {
local index="-1"
# Here is the dummy code
# as I don't know how to convert
# the perl script to bash command lines
# and get the result from perl script
index="
#!/usr/bin/perl
# String from which Substring
# is to be searched
$string = "Geeks are the best";
# Using index() to search for substring
$index = index ($string, 'the');
# Printing the position of the substring
print "Position of 'the' in the string: $index\n";
"
printf "%s" "$index"
}
result="$(bash_function_get_index_from_perl_script)"
echo "result is: $result"
以下是预期输出:
result is: 10
如何实现“bash_function_get_index_from_perl_script
“?
更新:
下面是bash函数测试:
#!/bin/bash
bash_function_get_index() {
local string="$1"
local search_string="$2"
before=${string%${search_string}*}
index=${#before}
printf "%s" "$index"
}
echo "test 1: $(bash_function_get_index "hello world" "wo")"
echo "test 2: $(bash_function_get_index "hello world" "wox")"
下面是输出:
test 1: 6
test 2: 11
“测试2”的结果是错误的,应该是:
test 2: -1
我想在Java中实现相同的“indexOf”函数:
https://www.w3schools.com/java/ref_string_indexof.asp
index_of() {
local string="$1"
local search_string="$2"
local fromIndex="$3"
local index=""
# Get the real index here, the result shoule be the same as the Java's "indexOf"
printf "%s" "$index"
}
更新二:
以下是基于“@F. Hauri - Give Up GitHub
“解决方案的测试:
下面的test_example
用于获取“if (feature_is_enabled(Feature_111111)) {
“和“}
“之间的“inner code
“。
我使用了第二个变量“hello_world
“来获取from_index
,以获取“}"的真实的索引。
但是“test_example
“没有按预期工作。似乎“indexOf()
“功能没有按预期工作。
#!/bin/bash
indexOf() {
if [[ $1 == -v ]]; then
local -n _iO_result="$2"
shift 2
else
local _iO_result
fi
local _iO_string="$2" _iO_substr="$1" _iO_lhs
_iO_lhs=${_iO_string%"$_iO_substr"*}
_iO_result=${#_iO_lhs}
((_iO_result == ${#_iO_string} )) && _iO_result=-1
case ${_iO_result@A} in _iO_result=* ) echo $_iO_result;;esac
}
indexOf_my_params() {
local string="$1"
local search_string="$2"
local from_index="$3"
local offset=-1
if [[ "$from_index" == "" ]]
then
offset=0
else
if (( $from_index < 0 ))
then
from_index=0
fi
local count=$((${#string} - $from_index))
if (( $count >= 0 ))
then
offset=$from_index
string="${string:from_index:count}"
fi
fi
local index=-1
if [[ "$offset" != "-1" ]]
then
index="$(indexOf "$search_string" "$string")"
if (( $index != -1 ))
then
index=$(($index + $offset))
fi
fi
printf '%s' "$index"
return "$((index < 0))"
}
test_example() {
local content="$(cat <<END
initialize(args, hw);
if (feature_is_enabled(Feature_111111)) {
args.add("foo");
if(1>2) {
args.add("test");
}else{
args.add("x");
}
args.add("hello world");
}
if (feature_is_enabled(Feature_222222)) {
args.add("bar");
}
END
)"
local feature_1_if_begin="if (feature_is_enabled(Feature_111111)) {"
local hello_world="args.add(\"hello world\");"
local feature_1_if_end="}"
local feature_1_if_begin_index="$(indexOf_my_params "$content" "$feature_1_if_begin")"
echo "feature_1_if_begin_index: $feature_1_if_begin_index"
local hello_world_index="$(indexOf_my_params "$content" "$hello_world" "$(($feature_1_if_begin_index + ${#feature_1_if_begin}))")"
echo "hello_world_index: $hello_world_index"
local feature_1_if_end_index="$(indexOf_my_params "$content" "$feature_1_if_end" "$(($hello_world_index + ${#hello_world}))")"
echo "feature_1_if_end_index: $feature_1_if_end_index"
local feature_1_if_block_code="${content:$(($feature_1_if_begin_index + ${#feature_1_if_begin})):$(($feature_1_if_end_index - $feature_1_if_begin_index - ${#feature_1_if_begin}))}"
echo "------ feature_1_if_block_code (inner code) ------"
printf "%s\n" "$feature_1_if_block_code"
}
test_example
exit 0
实际输出(输出错误):
feature_1_if_begin_index: 22
hello_world_index: 169
feature_1_if_end_index: 260
------ feature_1_if_block_code (inner code) ------
args.add("foo");
if(1>2) {
args.add("test");
}else{
args.add("x");
}
args.add("hello world");
}
if (feature_is_enabled(Feature_222222)) {
args.add("bar");
以下是预期输出:
------ feature_1_if_block_code (inner code) ------
args.add("foo");
if(1>2) {
args.add("test");
}else{
args.add("x");
}
args.add("hello world");
为什么当search keyword
是“}
“时,“indexOf()
“不工作?
UPDATE 3(使用与UPDATE 2相同的“内容”进行测试):
以下是Paul Hodges的解决方案,但仍然没有按预期工作:请注意,我将函数名“index
“重命名为“indexof_paul_hodges
“。
#!/bin/bash
indexof_paul_hodges ()
{
local string="$1" key="$2" fromIndex=${3:-0};
(( fromIndex )) && string=${string:$fromIndex};
if [[ "$string" =~ "$key" ]]; then
local ndx="${string%%"$key"*}";
echo ${#ndx};
else
echo "-1";
fi
}
test_example() {
local content="$(cat <<END
initialize(args, hw);
if (feature_is_enabled(Feature_111111)) {
args.add("foo");
if(1>2) {
args.add("test");
}else{
args.add("x");
}
args.add("hello world");
}
if (feature_is_enabled(Feature_222222)) {
args.add("bar");
}
END
)"
local feature_1_if_begin="if (feature_is_enabled(Feature_111111)) {"
local hello_world="args.add(\"hello world\");"
local feature_1_if_end="}"
local feature_1_if_begin_index="$(indexof_paul_hodges "$content" "$feature_1_if_begin")"
echo "feature_1_if_begin_index: $feature_1_if_begin_index"
local hello_world_index="$(indexof_paul_hodges "$content" "$hello_world" "$(($feature_1_if_begin_index + ${#feature_1_if_begin}))")"
echo "hello_world_index: $hello_world_index"
local feature_1_if_end_index="$(indexof_paul_hodges "$content" "$feature_1_if_end" "$(($hello_world_index + ${#hello_world}))")"
echo "feature_1_if_end_index: $feature_1_if_end_index"
local feature_1_if_block_code="${content:$(($feature_1_if_begin_index + ${#feature_1_if_begin})):$(($feature_1_if_end_index - $feature_1_if_begin_index - ${#feature_1_if_begin}))}"
echo "------ feature_1_if_block_code (inner code) ------"
printf "%s\n" "$feature_1_if_block_code"
}
test_example
exit 0
以下是“indexof_paul_hodges
“的输出(结果错误):
feature_1_if_begin_index: 22
hello_world_index: 106
feature_1_if_end_index: 33
------ feature_1_if_block_code (inner code) ------
args.add("foo");
if(1>2) {
args.add("test");
}else{
args.add("x");
}
args.add("hello world");
}
if (feature_is_enabled(Feature_222
UPDATE 4(使用与UPDATE 2
相同的test_example()
进行测试):
以下是来自@choroba的解决方案:
#!/bin/bash
bash_function_get_index() {
local string=$1
local search=$2
[[ $string = *"$search"* ]] || { printf %s -1 ; return ; }
local before=${string%%"$search"*}
local index=${#before}
printf %s "$index"
}
indexOf_my_params() {
local string="$1"
local search_string="$2"
local from_index="$3"
local offset=-1
if [[ "$from_index" == "" ]]
then
offset=0
else
if (( $from_index < 0 ))
then
from_index=0
fi
local count=$((${#string} - $from_index))
if (( $count >= 0 ))
then
offset=$from_index
string="${string:from_index:count}"
fi
fi
local index=-1
if [[ "$offset" != "-1" ]]
then
index="$(bash_function_get_index "$string" "$search_string")"
if (( $index != -1 ))
then
index=$(($index + $offset))
fi
fi
printf '%s' "$index"
return "$((index < 0))"
}
这里是UPDATE 4的输出(结果是正确的)
feature_1_if_begin_index: 22
hello_world_index: 169
feature_1_if_end_index: 194
------ feature_1_if_block_code (inner code) ------
args.add("foo");
if(1>2) {
args.add("test");
}else{
args.add("x");
}
args.add("hello world");
3条答案
按热度按时间4dc9hkyq1#
有很多方法。例如,你可以将脚本发送到perl的标准输入:
但是你不需要Perl来做这件事,你可以在bash本身中使用参数扩展来找到位置:
若要包含起始位置,只需在尝试匹配子字符串之前从字符串中删除起始位置之前的所有内容。不要忘记将起始位置添加到结果中:
8tntrjer2#
bash中 string 中 substring 的索引
试试这个:
作为函数
使用
-v
选项来分配变量而不是回显。为了避免无用的叉子:一个例外:如果未找到 substring,则答案为
-1
。测试和语法
然后
然后为了避免分叉
var=$(function...)
,使用-v var
选项!!应产生:
为什么我坚持 * 避免分叉 *
试着运行1 '000次作业:
从大约1秒到大约3100秒!!
无可奉告!
carvr3hs3#
我不认为这是做什么显着不同,从别人做什么,但实现了你所要求的与本机内置的语法,也许是一个更容易阅读?
编辑
这有点像一个XY Problem和一个可怕的脆弱的Y。你到底想完成什么?
一般来说,除非你是完全完全控制和唯一控制代码的(甚至可能不是这样),否则不要试图以这种方式解析代码。一个小的“无害”更改现在会破坏您的解析。
即便如此,您的问题是您使用的偏移量并不是从同一个地方开始计数的。你必须从源字符串的开头开始索引,即使你必须在中间使用一个点来识别正确的右括号.这就是为什么它如此脆弱。
运行时:
再问一遍:你实际上想完成什么?