Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 将子字符串的多个匹配项替换为它们的索引_String_Bash_Awk_Sed - Fatal编程技术网

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-
    上的串联运算符
    $c
    的值,同时将其增加1
Perl来营救

echo 'This is a test.' | perl -pe 's/is/"X-" . $c++/ge' 
  • -p
    逐行读取输入,在其上运行代码并输出处理后的行
  • s///g
    全局运行替换,即在所有可能的位置上运行替换
  • /e
    将替换零件解释为代码并运行它。这里的代码使用字符串
    X-
    上的串联运算符
    $c
    的值,同时将其增加1

    • 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开始,让我知道,如果这里有任何查询。