我想用另一组中的相应字符替换一组字符,如下所示:
original set: ots
"target" set: u.x
foobartest ? fuubar.ex.
Run Code Online (Sandbox Code Playgroud)
像这样的翻译/音译是tr
命令的特色:
$ echo 'foobartest' | tr 'ots' 'u.x'
fuubar.ex.
Run Code Online (Sandbox Code Playgroud)
不幸的是,tr
它不支持像sed
这样就地更改文件。
我想使用sed
这样我就不必重新发明处理临时文件的轮子了。
n.s*_*.st 28
sed
有这样的y
命令tr
:
$ echo 'foobartest' | sed 'y/ots/u.x/'
fuubar.ex.
Run Code Online (Sandbox Code Playgroud)
该y
命令是POSIXsed
规范的一部分,因此它应该适用于几乎任何平台。
并且因为它是sed
,你可以让它用它的编辑版本替换一个文件,省去麻烦的临时文件业务(假设你的实现sed
支持该-i
选项,这不是由 POSIX 指定的):
$ sed -i 'y/ots/u.x/' some-file.txt
Run Code Online (Sandbox Code Playgroud)
如果就像你的情况一样,你在不改变它们的大小的情况下音译字符(无论如何,像 GNU 这样的一些实现tr
只支持单字节字符),你可以这样做:
tr 'ots' 'u.x' < file 1<> file
Run Code Online (Sandbox Code Playgroud)
也就是说,已经tr
覆盖文件本身。
这比sed -i
几个帐户要好:
一个缺点是,如果它被中断,文件最终会被翻译一半(但在这种情况下,您可以再次运行以完成它)。一些sed
实现会通过确保原始文件保持不变来正确处理,除非命令成功。
归档时间: |
|
查看次数: |
6017 次 |
最近记录: |