我有一个用户名列表,我想添加可能的组合。
实施例。让我们说这是我的名单
johna
maryb
charlesc
是否有办法使用sed按照它的样子进行编辑
ajohn
bmary
ccharles
还
john_a
mary_b
charles_c
等等......
任何人都可以帮助我获取命令,任何解释都会很棒。我想了解它是如何工作的。当我看到诸如's/\.(.*....
之类的东西时,我常常感到困惑,而不知道其中的一些是什么意思......无论如何都要提前感谢。
编辑...我更改了用户名
答案 0 :(得分:1)
sed s/\(user\)\(.\)/\2\1/
故障:
sed s/string/replacement/
会将string
的所有实例替换为replacement
。
然后,该sed表达式中的string
为\(user\)\(.\)
。这可以分为两个
部分:\(user\)
和\(.\)
。其中每个都是捕获组 - 由\(
\)
括起来。这意味着一旦我们与它们匹配,我们就可以在替换字符串中重用它。
\(user\)
匹配字符串的user
部分。 \(.\)
匹配任何单个字符 - 这就是.
的含义。然后,您有两个已捕获的群组 - user
和a
(或b
或c
)。
替换部件只是使用这些来重新创建模式略有不同。 \2\1
说“打印第二个捕获组,然后打印第一个捕获组”。在这种情况下,会打印auser
- 因为我们将user
和a
与每个组匹配。
例如:
$ 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)中)并交换它们。