Q
替换字符
1
A
回答
3
目前尚不清楚你的意思是“列”,但也许这是你想要使用GNU AWK的gensub()什么:
$ echo iqwertyuiop | awk '{print substr($0,1,3) gensub(/i/,"Z","g",substr($0,4))}'
iqwertyuZop
1
最直观的方法是使用awk
:
awk 'BEGIN{FS="";OFS=FS}{for(i=4;i<=NF;i++){if($i=="i"){$i="Z"}}}1' file
FS=""
由字符将输入字符串转换成田。我们迭代低谷字符/字段4结束并用Z
替换i
。
最后的1
评估为true
并且使awk
打印修改的输入行。
随着sed
它看起来不是很intutive但它仍然是可能的:
sed -r '
h # Backup the current line in hold buffer
s/.{3}// # Remove the first three characters
s/i/Z/g # Replace all i by Z
G # Append the contents of the hold buffer to the pattern buffer (this adds a newline between them)
s/(.*)\n(.{3}).*/\2\1/ # Remove that newline ^^^ and assemble the result
' file
1
这完全是理想的tr
命令,只要你没有要求前3字符保持不变。
但是,如果你是没事使用一些bash的技巧加上cut
和paste
,你可以将文件分割成两个部分,并将其粘贴到一起后记:
paste -d'\0' <(cut -c-3 foo) <(cut -c4- foo | tr i Z)
上述用途paste
两个归队一起与cut
分开的文件部分。第二部分通过tr
通过管道将i转换为Z's。
1
(1)下面是完成一个短期和简单的方法任务使用GNU sed的:
sed -r -e ':a;s/^(...)([^i]*)i/\1\2Z/g;ta'
这需要循环(t
),所以不会像非循环的方法一样有效。上面也可以使用转义括号而不是非转义字符来编写,因此不需要-r选项。 sed的其他实现应该(原则上)完成任务,但是您的MMV。
(2)这是很容易使用, “旧的AWK” 以及:
awk '{s=substr($0,4);gsub(/i/,"Z",s); print substr($0,1,3) s}'
3
Perl是得心应手这样的:你可以分配到子
$ echo "iiiiii" | perl -pe 'substr($_,3) =~ s/i/Z/g'
iiiZZZ
相关问题
- 1. python替换字符而不替换已替换的字符
- 2. 替换“^”字符
- 3. 替换字符
- 4. 替换字符
- 5. 替换字符
- 6. 字符替换
- 7. 替换字符串字符
- 8. 字符串替换交替
- 9. 增强字符串替换不会替换换行字符串
- 10. Chrome字符替换
- 11. 替换字符串
- 12. 替换字符串
- 13. Solr - 字符替换
- 14. 字符串替换
- 15. Unicode替换字符
- 16. 替换字符串
- 17. 替换字符的
- 18. 替换字符串
- 19. php替换字符
- 20. 替换多字符
- 21. 替换字符串
- 22. 替换字符串
- 23. C++字符替换
- 24. 替换Unicode字符
- 25. 替换字符串[]
- 26. 替换字符串
- 27. 替换字符串
- 28. 替换字符串
- 29. 替换Unicode字符
- 30. XSL替换字符()
你能不能1)使用'y/i/Z /'(保存一个完整的字符!)2)而不是'x; s; G; s' do'G; s /(。*)\ n(...)。*/\ 2 \ 1 /'? –
@BenjaminW。1)'y'命令在多行版本后需要一个';',如果它后面有注释。不要问我为什么。 2)好点!补充说 – hek2mgl