我必须1
用one
、two
等替换,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
可以
写出所有替换
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
使用
perl
数组perl -lpe '@a=qw(zero one two three four five six seven eight nine);s/(?<!\d)(\d)(?!\d)/$a[$1]/g' test.txt
循环遍历一行代码
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