2012-12-21 48 views
0

我该如何在sed中做什么tr "ae" "ea"呢?我不能使用像this question这样的临时字符串,因为我不知道字符串保证不会出现在文本中。同时交换两个字符串

也许我可以先用一个反斜杠等等来逃避所有'a','e'和'\'......还是有更简单的方法吗?

谢谢。

回答

1

您可以使用transform (y) command;

sed 'y/ae/ea/' 

>回声aerodame | sed的“Y/AE/EA /”
earodema

+0

我很想知道为什么我被低估了这个答案。当然,听起来对我来说更容易... ...? –

+0

[后]可能是因为y /必须是静态宽度,并会抱怨它,但是,tr,默认情况下,虽然它也需要静态宽度,但不会抱怨它,因此如果可互换使用会导致细微的错误 – osirisgothra

3

你有你的答案,但你的WRT声明说:“在这个问题上,我不能使用临时串类的,因为我不知道一个字符串,它是保证不会出现在文本中。“你可以创建一个字符串,像这样的:

sed 's/@/@A/g; s/foo/@B/g; s/bar/foo/g; s/@B/bar/g; s/@A/@/g' file 

所有的“@”字符以上转换为字符串“@A”,那么首先将“富” s到“@Bs”交换foo和酒吧。此时,您可以保证在文本中没有“@B”,因为每个原始的“@”现在都有一个“A”,后面是第一个//。其余的应该是显而易见的。

这是一个非常有用的技术,当你需要做其他操作使用一些其他的命令(S)文件和需要一些字符串有保证不被输入:

sed 's/@/@A/g' file | <commands using @B, @C, etc.> | sed 's/@A/@/g' 

显然,你需要以确保您在中间使用的任何命令都不会生成“@A”(或您选择的任何替换字符串)作为其输出的一部分!

+0

这很好。 – potrzebie