可以sed处理替换并同时评估表达式以某种方式替换吗?
例如,我在文本文件中有以下条目:
##################################### topd Tree1 - Tree14 #######################################
由于我不会参与的原因,相对于我到目前为止使用的另一个编号方案,每个树的数字是N + 1。
可以sed(或者任何实用程序,sed只是我的查找和替换操作),查找TreeN
的每个实例并将其替换为TreeN-1
,以便上面的行然后看起来像:
##################################### topd Tree0 - Tree13 #######################################
(使用Ubuntu 12.02,几乎任何事情都可以。)
答案 0 :(得分:3)
使用perl
perl -pe 's/Tree\K\d+/$&-1/ge' file
输出
##################################### topd Tree0 - Tree13 #######################################
答案 1 :(得分:1)
我在这种情况下使用perl,使用Shortcut currently used by
修饰符来评估替换部分中的表达式:
e
您还可以利用更高级的正则表达式支持,例如:通过使用lookbehind断言:
perl -pe 's/(Tree)(\d+)/$1 . ($2 - 1)/ge'
答案 2 :(得分:0)
你可以试试这个;
sed 's/[^0-9,-]*//g' filename | sed -e "s/-/ /g" | awk '{print "##################################### topd Tree"$1-1 " - Tree" $2-1 " #######################################"}'
awk '{gsub(/Tree/,"Tree ",$0);print $1" "$2" "$3$4-1" "$5" "$6$7-1" "$8}' filename
答案 3 :(得分:0)
使用下面的gnu awk
awk '{
for(i=1;i<=NF;i++){
$i ~ /^Tree[[:digit:]]+$/
{
n=(gensub(/Tree/,"",1,$i)-1);
$i=gensub(/Tree([[:digit:]]+)/,"Tree"n,1,$i);
}
}
print}' file
会做的伎俩