使用sed操作字符

使用sed操作字符,sed,Sed,我有一个用户名列表,我想添加可能的组合 例如。假设这是我的清单 johna maryb charlesc 是否有一种方法可以使用sed按其外观进行编辑 ajohn bmary ccharles 而且 john_a mary_b charles_c 等等 如果有人能帮我得到这样做的命令,任何解释都会很棒。如果可能的话,我想了解它是如何工作的。当我看到像的/\(.*...这样的东西时,我通常会感到困惑,而不知道其中的一些意思…无论如何,请提前感谢 编辑…我更改用户名以下是可能最简单部分的部分答

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

例如。假设这是我的清单

johna
maryb
charlesc
是否有一种方法可以使用sed按其外观进行编辑

ajohn
bmary
ccharles
而且

john_a
mary_b
charles_c
等等

如果有人能帮我得到这样做的命令,任何解释都会很棒。如果可能的话,我想了解它是如何工作的。当我看到像
的/\(.*...
这样的东西时,我通常会感到困惑,而不知道其中的一些意思…无论如何,请提前感谢


编辑…我更改用户名

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

sed 's/user/user_/' temp
其中,temp是包含初始用户名列表的文件名。其工作原理:它在每一行上查找“user”的第一个实例,并将其替换为“user”

类似于您的dot示例:

sed 's/user/user./' temp
将每行的第一个“user”实例替换为“user”。

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

细分:

sed s/string/replacement/
将用
replacement
替换
字符串的所有实例

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

\(user\)
匹配字符串的
user
部分,这令人惊讶。
\(.\)
匹配任何单个字符-这就是
的意思。然后,您有两个捕获组-
user
a
(或
b
c

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

例:

您可以将
\2\1
更改为使用所需的任何字符串,即
\2\u1
将提供一个用户、一个用户、一个用户

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

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

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

这样,您就不需要事先知道用户名。

使用
awk

awk '{a=$NF;$NF="";$0=a$0}1' FS="" OFS="" file
ajohn
bmary
ccharles

通过将
FS
设置为nothing,每个字母都是
awk
中的一个字段。您可以轻松地对其进行操作。
无需使用捕获组等,只需简单的字段交换。

这可能适合您(GNU-sed):


这将匹配除下划线(在第一个反向引用(\1)中)、可能的下划线和最后一个字符(在第二个反向引用(\2))之外的任何字符为了理解你在网上找到的命令,你应该读一本教程,比如。谢谢dlahr。为了让所有用户都有相同的名字模式,这会很好。好吧,也许我问得不对,我的错……但是如果不是usera userb,而是johnc marym etcHi指挥官呢,谢谢你的回答.我做了一些编辑,以更具体地指出我的需要。我很抱歉,因为我一开始不清楚。+1,但是,在您的解释中,我建议调用第一个
s
参数regex(或类似的东西)而不是字符串;而且,不需要使用
g
选项。@user3635042:只需在
sed
命令中将
user
替换为
*
,您就可以随心所欲了。不,我想没有,嘿?我有一个坏习惯,就是在任何时候只要键入g,我想匹配多个模式…;)就像@mklement0所说的,除了用户编辑之外,让这个字符串与其他字符串匹配是很简单的。@mklement0解决了这个问题。非常感谢:D指挥官,谢谢
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
sed -r 's/^([^_]*)_?(.)$/\2\1/' file