String 将子字符串的多个匹配项替换为它们的索引
假设您有一个字符串,该字符串多次出现在同一子字符串中,用另一个包含数学索引的子字符串替换匹配项的最佳方法是什么?例如,假设您有以下字符串:String 将子字符串的多个匹配项替换为它们的索引,string,bash,awk,sed,String,Bash,Awk,Sed,假设您有一个字符串,该字符串多次出现在同一子字符串中,用另一个包含数学索引的子字符串替换匹配项的最佳方法是什么?例如,假设您有以下字符串:这是一个测试。我们想用X替换所有出现的is,并将其索引替换为类似于:ThX-0 X-1的测试。 有什么想法吗?Perl来拯救我们 echo 'This is a test.' | perl -pe 's/is/"X-" . $c++/ge' -p逐行读取输入,在其上运行代码并输出处理后的行 s///g全局运行替换,即在所有可能的位置上运行替换 /e将替换
这是一个测试。
我们想用X
替换所有出现的is
,并将其索引替换为类似于:ThX-0 X-1的测试。
有什么想法吗?Perl来拯救我们
echo 'This is a test.' | perl -pe 's/is/"X-" . $c++/ge'
逐行读取输入,在其上运行代码并输出处理后的行-p
全局运行替换,即在所有可能的位置上运行替换s///g
将替换零件解释为代码并运行它。这里的代码使用字符串/e
上的串联运算符X-
和
的值,同时将其增加1$c
echo 'This is a test.' | perl -pe 's/is/"X-" . $c++/ge'
逐行读取输入,在其上运行代码并输出处理后的行-p
全局运行替换,即在所有可能的位置上运行替换s///g
将替换零件解释为代码并运行它。这里的代码使用字符串/e
上的串联运算符X-
和
的值,同时将其增加1$c
- awk中的简单解决方案将是:
awk '{while(sub(/[iI][Ss]/,"X-"count++)){a=""};count=""} 1' Input_file
或者根据anubhava sir的评论,添加上述代码的较短版本:
awk '{while(sub(/[iI][Ss]/,"X-"count++));count=""} 1' Input_file
简单的解释是,运行一个循环,直到找到一个替换项,并且在其中不执行任何操作:)最后打印这行。
awk
中的简单解决方案是:
awk '{while(sub(/[iI][Ss]/,"X-"count++)){a=""};count=""} 1' Input_file
或者根据anubhava sir的评论,添加上述代码的较短版本:
awk '{while(sub(/[iI][Ss]/,"X-"count++));count=""} 1' Input_file
简单的解释是,运行一个循环直到找到一个替换项,并且在循环中什么也不做:)最后打印这行。这里有一个gnu awk one liner的替代方案:
echo 'This is a test.' | awk -v RS='[iI][sS]' '{ORS = "X-" i++} 1'
要重置每行的计数器,请执行以下操作:
printf '%s\n%s\n' 'This is a test.' 'This is another this' |
awk -v RS='[iI][sS]' '/\n/{i=0} {ORS = "X-" i++} 1'
这里有一个gnu awk一号班轮的备选方案:
echo 'This is a test.' | awk -v RS='[iI][sS]' '{ORS = "X-" i++} 1'
要重置每行的计数器,请执行以下操作:
printf '%s\n%s\n' 'This is a test.' 'This is another this' |
awk -v RS='[iI][sS]' '/\n/{i=0} {ORS = "X-" i++} 1'
如果希望它不区分大小写呢?只需添加
/i
修饰符,即/gei
。谢谢,它可以工作。它很好用。但是,您如何将计数器的范围限制为行?我的意思是,如果您希望索引在每行中从0开始,该怎么办?@amin:然后在替换前加上$c=0
。如果希望它不区分大小写呢?只需添加/i
修饰符,即/gei
。谢谢,它可以工作。它很好用。但是,您如何将计数器的范围限制为行?我的意思是,如果您希望索引在每行中从0开始,该怎么办?@amin:然后在替换前加上$c=0代码>。这可能更短:awk'{while(sub(/[iI][Ss]/,“X-”count++);}1'
@anubhava,当然谢谢,先生,现在添加了这个版本,干杯。谢谢你们。它起作用了。但是,您如何将计数器的范围限制到该行?我的意思是,如果你想让索引从每一行的0开始怎么办?@amin,现在确实做了更改,这些将从X的计数开始-从每一行的0开始,让我知道在这里有任何查询。这可能会更短:awk'{while(sub(/[iI][Ss]/,“X-”count++);}1'
@anubhava,当然谢谢你,先生现在添加了这个版本,干杯,谢谢你们。它起作用了。但是,您如何将计数器的范围限制到该行?我的意思是,如果你想让索引从每一行的0开始,该怎么办?@amin,当然现在已经做了更改,这些更改将从X的计数开始-从每一行的0开始,让我知道,如果这里有任何查询。