使用sed操纵字符

时间:2014-06-28 19:38:21

标签: sed

我有一个用户名列表,我想添加可能的组合。

实施例。让我们说这是我的名单

johna
maryb
charlesc

是否有办法使用sed按照它的样子进行编辑

ajohn
bmary
ccharles

john_a
mary_b
charles_c
等等......

任何人都可以帮助我获取命令,任何解释都会很棒。我想了解它是如何工作的。当我看到诸如's/\.(.*....之类的东西时,我常常感到困惑,而不知道其中的一些是什么意思......无论如何都要提前感谢。

编辑...我更改了用户名

5 个答案:

答案 0 :(得分:1)

sed s/\(user\)\(.\)/\2\1/

故障:

sed s/string/replacement/会将string的所有实例替换为replacement

然后,该sed表达式中的string\(user\)\(.\)。这可以分为两个 部分:\(user\)\(.\)。其中每个都是捕获组 - 由\( \)括起来。这意味着一旦我们与它们匹配,我们就可以在替换字符串中重用它。

令人惊讶的是,

\(user\)匹配字符串的user部分。 \(.\)匹配任何单个字符 - 这就是.的含义。然后,您有两个已捕获的群组 - usera(或bc)。

替换部件只是使用这些来重新创建模式略有不同。 \2\1说“打印第二个捕获组,然后打印第一个捕获组”。在这种情况下,会打印auser - 因为我们将usera与每个组匹配。

例如:

$ echo "usera
> userb
> userc" | sed "s/\(user\)\(.\)/\2\1/"
auser
buser
cuser

您可以更改\2\1以使用您想要的任何字符串 - 即。 \2_\1将提供a_user,b_user,c_user。

此外,为了匹配任何前面的字符串(不仅仅是“用户”),只需将\(user\)替换为\(.*\)即可。例如:

$ echo "marya
> johnb
> alfredc" | sed "s/\(.*\)\(.\)/\2\1/"
amary
bjohn
calfred

答案 1 :(得分:0)

这里可能是一个简单部分的部分答案。要使用sed将usera更改为user_a,您可以使用:

sed 's/user/user_/' temp

其中temp是包含初始用户名列表的文件的名称。这是如何工作的:它是找到" user"的第一个实例。在每一行上并用" user _"

替换它

同样适合您的点示例:

sed 's/user/user./' temp

将替换" user"的第一个实例在" user。"

的每一行

答案 2 :(得分:0)

Sed不提供非贪婪的正则表达式,因此我建议perl

perl -pe 's/(.*?)(.)$/$2$1/g' file
ajohn
bmary
ccharles

perl -pe 's/(.*?)(.)$/$1_$2/g' file
john_a
mary_b
charles_c

这样你就不需要事先知道用户名了。

答案 3 :(得分:0)

使用awk

的简单解决方案
awk '{a=$NF;$NF="";$0=a$0}1' FS="" OFS="" file
ajohn
bmary
ccharles

awk '{a=$NF;$NF="";$0=$0"_" a}1' FS="" OFS="" file
john_a
mary_b
charles_c

通过将FS设置为空,每个字母都是awk中的字段。然后你可以轻松操纵它 并且不需要使用捕获组等,只需简单的字段交换。

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/^([^_]*)_?(.)$/\2\1/' file

这匹配下划线以外的任何字符(在第一个后引用(\ 1)中),可能的下划线和最后一个字符(在第二个后引用(\ 2)中)并交换它们。