SED在数据库文件中搜索和替换子字符串

SED在数据库文件中搜索和替换子字符串,sed,Sed,对所有人来说 我已经花了很多时间寻找解决方案,但找不到它 作为背景,我有一个包含数千条记录的文本数据库。每个记录由以下内容描述: “0@nnnnnn@Xnnn”//无引号 记录在一行中有许多字段,但我感兴趣的字段用于搜索和替换子字符串(注意空格): “1 X94 User1.faculty.ventura.ca”//无引号 我想使用sed将子字符串“.faculty.ventura.ca”更改为“.students.moorpark.ut”,在所有记录中不更改任何其他内容 我测试过很多东西,结果

对所有人来说

我已经花了很多时间寻找解决方案,但找不到它

作为背景,我有一个包含数千条记录的文本数据库。每个记录由以下内容描述:

“0@nnnnnn@Xnnn”//无引号

记录在一行中有许多字段,但我感兴趣的字段用于搜索和替换子字符串(注意空格):

“1 X94 User1.faculty.ventura.ca”//无引号

我想使用sed将子字符串“.faculty.ventura.ca”更改为“.students.moorpark.ut”,在所有记录中不更改任何其他内容

我测试过很多东西,结果都是否定的

如何做到这一点

谢谢你的帮助。
鲍勃·佩雷斯(robertperez1957@gmail.com)

如果我理解正确,您希望:

sed 's/1 X94 \(.*\).faculty.ventura.ca/1 X94 \1.students.moorpark.ut/' mydatabase.file
这将用
1 X94 XXXXX.students.moorpark.ut
替换表格
1 X94 XXXXXX.faculty.ventura.ca
中的所有记录

以下是所有这些功能的详细信息:

  • 允许您在脚本中使用空格和其他混乱
  • s/
    表示替换
  • 1x94\(.*).faculty.ventura.ca
    是您将要替换的内容。
    \(.*)
    将任何内容存储在该正则表达式中,以供替换使用
  • 1x94\1.students.moorpark.ut
    是用来替换您找到的东西的\1由匹配的第一项内容填写。
    \(.\\)
    。(一行中可以有多个,下一行是\2。)
  • 最后的
    /
    只是告诉sed您已经完成了。如果您的数据库没有用于分隔其记录的换行符,则需要以
    /g
    结尾,以便每行多次进行此更改
  • mydatabase.file应该是数据库的文件名
请注意,这将输出到标准输出。您可能需要添加

> mynewdatabasefile.name
到行尾,将所有输出保存到文件中。(这对你的终端没什么好处。)

根据您的评论进行编辑 如果要将
1 F94 bperez.students.Napvil.NCC
替换为
1 F94 bperez.JohnSmith.customer
,可以使用另一组
\(.\)
,如下所示:

sed 's/1 X94 \(.*\).\(.*\).Napvil.NCC/1 X94 \1.JohnSmith.customer/' 251-2.txt
这与上面的类似,只是它匹配两个存储的参数。在本例中,
\1
计算为
bperez
\2
计算为
学生
。我们匹配
\2
,但不在表达式的替换部分使用它。 您可以使用任意数量的存储参数执行此操作。(Sed可能有一些限制,但我从来没有碰到过足够复杂的字符串来达到它。)例如,我们可以将Sed脚本设置为
\(.\)\(.\)\(.\)\(.*).\(.*).\(.\)/\1\2\3.JohnSmith.customer/'
,这将使\1=1、\2=X94、\3=bperez、\4=Napvil和\5=NCC,我们将忽略\4和\5。然而,这实际上不是最好的答案——只是表明它是可以做到的。它不是最好的,因为它更丑陋,也因为它更容易接受。然后,它将在一行上执行查找和替换,如
2z12bperez.a.b.c
,这可能不是您想要的。我在编辑中输入的find查询尽可能具体,同时仍然足够通用,以适合您的任务

再编辑一次! 你知道我说的“尽可能具体”吗?由于
角色的特殊性,我没有。事实上,我很普通。
表示“匹配任何字符”,而不是“匹配句点”。正则表达式是“贪婪”的,尽可能地匹配,所以
\(.*)。\(..*)
总是尽可能地填充第一个
\(.*)
(这表示“将任何字符中的许多字符取0,并将其保存为匹配项以备以后使用”)。 尝试使用:

    sed 's/1 X94 \(.*\)\.\(.*\).Napvil.NCC/1 X94 \1.JohnSmith.customer/' 251-2.txt

额外的
\
充当转义序列,并将
从“任意字符”更改为“仅限句点”。FI,因为我不(但应该)逃离其他时期,技术上的SED会考虑<代码> 1 X9XXXX。由于
表示任何字符,因此Z或Q将被视为合适的字符。

以下教程对我有所帮助

使用-i前缀直接替换文件中的内容

sed-i's/unix/linux/'file.txt


斯科特,它工作得很好。然而,我忘了提到第1条(共2条):斯科特,它工作得很好。但是我忘了提到在“.Napvil.NCC”之前我可能有5个不同的名字——注意这个例子。我之前为隐私编造了一些文字,它实际上是以下信息:我有5个不同的场景的可能性,这个字段在记录中:1。“1 F94 bperez.stdnts.Napvil.NCC”//2无报价。“1 F94 BJohnson.Stdnts.Napvil.NCC”3。“1 F94 WLasson.OthrUsr.Napvil.NCC”4。“1 F94 Napvil.NCC汽油机工厂”5。“1F94 IMessenger.Admstr.Napvil.NCC”注释2/2:我需要将所有这些可能性更改为:“1F94 UniqueUserName.JohnSmith.customer”,而不是您在上面看到的“1F94 UserName”后面的1-5。我使用了:sed的s/1F94(.*).Napvil.NCC/1 F94\1.JohnSmith.customer/'251-2.txt上述sed命令使我明白:1 F94 BJohnson.stdnts.JohnSmith.customer感谢您在这方面的帮助,Bob Perez,robertperez1957@gmail.comScott:使用此SED命令:SED的s/1 F94(.*)(.*).Napvil.NCC/1 F94\1.JeffSchopp.customer/'251-2.txt我从:1 F94 User1.Stdnt.Napvil.NCC到:1 F94 User1.Stdnt.JohnSmith.customer我需要它说:1 F94 User1.JohnSmith.customer注意:我假设字母的情况没有考虑进去?使用SED命令:SED's/1f94(.*)。(.*)。(.*).Napvil.NCC/1f94\1.JeffSchopp.customer/'251-2.txt,我得到与上面相同的结果。。。不确定什么