使用 sed 仅替换某些数字

使用 sed 仅替换某些数字

我必须1onetwo等替换,2但例如 11 必须保持不变。使用

sed -i 's/1/one/g' 

文件名也改变 11.

我不知道如何逐行检查并只更改我需要的内容。还有其他方法吗?

答案1

你可以这样做perl

perl -lpe 's/(?<!\d)1(?!\d)/one/g' test.txt

解释:

  • perl擅长文本处理的脚本语言
  • -l合理处理行尾
  • p自动打印每一行
  • e执行以下命令
  • '开始指令
  • s/代替
  • (?<!\d)负向后视:匹配项不能跟在数字后面
  • 1文字1
  • (?<!\d)负向预测:匹配项后面不能跟数字
  • /one用文字替代one
  • /g替换所有匹配项
  • '指令结束

测试:

perl -lpe 's/(?<!\d)1(?!\d)/one/g' test.txt > test1.txt
head test*.txt
==> test.txt <==
1
11
111
a1
1a
1a1

==> test1.txt <==
one
11
111
aone
onea
oneaone

更新:要自动更改1-9,您one-nine可以

  1. 写出所有替换

    perl -lpe 's/(?<!\d)1(?!\d)/one/g;s/(?<!\d)2(?!\d)/two/g;s/(?<!\d)3(?!\d)/three/g;s/(?<!\d)4(?!\d)/four/g;s/(?<!\d)5(?!\d)/five/g;s/(?<!\d)6(?!\d)/six/g;s/(?<!\d)7(?!\d)/seven/g;s/(?<!\d)8(?!\d)/eight/g;s/(?<!\d)9(?!\d)/nine/g;' test.txt
    
  2. 使用perl数组

    perl -lpe '@a=qw(zero one two three four five six seven eight nine);s/(?<!\d)(\d)(?!\d)/$a[$1]/g' test.txt
    
  3. 循环遍历一行代码bash

    NUMBERS=(zero one two three four five six seven eight nine)
    for i in "${!NUMBERS[@]}"; do
        perl -i -lpe 's/(?<!\d)'$i'(?!\d)/'${NUMBERS[$i]}'/g' test.txt
    done
    

相关内容