【发布时间】:2020-05-30 11:34:59
【问题描述】:
假设你有一个字符串多次出现相同的子字符串,用另一个包含数学索引的子字符串替换匹配项的最佳单行代码是什么?例如,假设您有以下字符串:This is a test.,我们希望将所有出现的is 替换为X 及其索引,使其类似于:ThX-0 X-1 a test.
对此有什么想法吗?
【问题讨论】:
假设你有一个字符串多次出现相同的子字符串,用另一个包含数学索引的子字符串替换匹配项的最佳单行代码是什么?例如,假设您有以下字符串:This is a test.,我们希望将所有出现的is 替换为X 及其索引,使其类似于:ThX-0 X-1 a test.
对此有什么想法吗?
【问题讨论】:
Perl 来救援!
echo 'This is a test.' | perl -pe 's/is/"X-" . $c++/ge'
-p 逐行读取输入,运行代码并输出处理后的行。s///g 在全局范围内进行替换,即在所有可能的位置上进行替换/e 将替换部分解释为代码并运行它。这里的代码对字符串X-和$c的值使用串联运算符.,同时加一。【讨论】:
/i修饰符,即/gei。
$c=0;。
awk 中的简单解决方案是:
awk '{while(sub(/[iI][Ss]/,"X-"count++)){a=""};count=""} 1' Input_file
或者根据 anubhava 先生的评论添加上述代码的较短版本:
awk '{while(sub(/[iI][Ss]/,"X-"count++));count=""} 1' Input_file
简单的解释是,运行一个循环,直到找到一个替换并且在其中什么都不做:) 最后打印该行。
【讨论】:
awk '{while(sub(/[iI][Ss]/,"X-"count++));} 1'
这是另一种 gnu-awk one liner:
echo 'This is a test.' | awk -v RS='[iI][sS]' '{ORS = "X-" i++} 1'
ThX-0 X-1 a test.
重置每一行的计数器:
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'
ThX-0 X-1 a test.
ThX-0 X-1 another thX-2
【讨论】: