The i
sed 中的命令用于在行前插入文本。的一般语法为i
命令是:
sed '/pattern/i\text-to-be-inserted' filename
在本教程中,我们将重点介绍如何使用sed命令.
Sed Insert 让我们免于数月的手动编辑
有一天,当地一家小型 ISP 向我提出了一个有趣的问题。他们最近迁移了用户数据库,在此过程中,忽略了一个关键的格式更改。
他们拥有超过 100,000 条用户记录的列表,并且每条记录都缺少新系统所需的重要标识符。每条记录的格式如下:
username:hashed-password:account-status
但新系统需要:
username:hashed-password:UID:account-status
Here, UID
代表用户标识符,每个用户的唯一字母数字字符串。
如果没有 UID,ISP 的整个计费和使用跟踪系统就会出现故障,可能会导致重大收入损失和客户不满。
为超过 100,000 条记录手动插入这些 UID 不仅不切实际,而且对于他们的小团队来说会花费数月时间。
我决定使用sed
命令自动插入 UID。我编写了一个简单的脚本,为每个用户生成一个 UID,然后使用sed
将其插入到每条记录中的适当位置。
这是我使用的命令的简化示例:
sed -i 's/\(username:hashed-password:\)\(account-status\)/\1UID:\2/' user-database.txt
通过这个单一的命令,sed
不到 10 分钟就处理了该文件。
与手动编辑文件相比,一个小团队可能需要花费 800 多个小时(考虑用 5 分钟来编辑和验证每条记录)。
在特定行插入文本
要使用 sed 在文件中的特定行号处插入文本,可以使用以下语法:
sed 'LINE_NUMBER i\text-to-be-inserted' filename
例如,如果您想插入文本“This is line 3”。在“example.txt”文件的第三行,您可以使用以下命令:
sed '3 i\This is line 3.' example.txt
Output:
Apple
Banana
This is line 3.
Cherry
在此示例中,“3”是文本“This is line 3”所在的行号。插入到该行之前。
请注意,此命令不会修改原始文件。只在终端中显示修改后的内容。
如果要保存对文件的更改,可以将输出重定向到新文件或使用-i
sed 的选项。
例如,要将更改保存到新文件:
sed '3 i\This is line 3.' example.txt > newfile.txt
或者,要就地修改原始文件,您可以使用-i
option:
sed -i '3 i\This is line 3.' example.txt
在文件开头插入文本
要在文件开头插入文本,可以在 sed 命令中使用行号“1”,如下所示:
sed '1 i\text-to-be-inserted' filename
例如,如果您想插入文本“这是文件的开头”。在“example.txt”文件的开头,您可以使用以下命令:
sed '1 i\This is the start of the file.' example.txt
Output:
This is the start of the file.
Apple
Banana
Cherry
在此示例中,“1”是表示文件开头的行号。因此,文本“这是文件的开头。”被插入到文件的开头。
在最后一行之前插入
要在文件的最后一行之前插入文本,可以使用以下命令:
sed '$!b; i\This is the second last line.' example.txt
Output:
Apple
Banana
This is the second last line.
Cherry
在此命令中,$!b
跳过除最后一行之外的所有行,并且“i”命令插入文本“这是倒数第二行”。最后一行之前。
在特定匹配之前插入文本
要在包含特定模式的行之前插入文本,您可以使用i
sed 中的命令如下:
sed '/pattern/i\text-to-be-inserted' filename
例如,如果您想插入文本“这是一种水果”。在“example.txt”文件中包含“Cherry”的行之前,您可以使用以下命令:
sed '/Cherry/i\This is a fruit.' example.txt
Output:
Apple
Banana
This is a fruit.
Cherry
在此命令中,“/Cherry/”是 sed 在文件中搜索的模式。一旦找到带有该模式的行,它就会插入文本“这是一种水果”。在那条线之前。
在两个特定行之间插入文本
您可以结合i
and a
sed 中的命令在两个特定行之间插入文本。
例如,如果要在第二行和第三行之间插入文本example.txt
文件,可以使用以下命令:
sed '2 a\This is between second and third line' example.txt
Output:
Apple
Banana
This is between second and third line
Cherry
在此示例中,“2”是行号,在其后插入文本“This is Between Second and Third Line”。
基于模式的条件插入
仅当该行与特定模式匹配时,您才可以在该行之前或之后插入文本。
例如,如果您想在“example.txt”文件中包含“Banana”的行之前插入文本,但前提是该行还包含“Apple”,则可以使用以下命令:
sed '/Banana.*Apple/ i\This is a fruit.' example.txt
假设“example.txt”文件包含一行同时包含“Apple”和“Banana”的行:
Apple
Banana Apple
Cherry
Output:
Apple
This is a fruit.
Banana Apple
Cherry
在此示例中,模式“/Apple.*Banana/”与行“Banana Apple”匹配,因此文本“This is a Fruit”。插入该行之前。
插入转义字符
转义字符是用来表示某些特殊字符的字符,如换行符、制表符等。在 sed 中,转义字符前面有一个反斜杠 ()。
例如,如果要在“example.txt”文件的开头插入包含制表符、换行符和反斜杠的行,可以使用以下命令:
sed '1 i\\\t\\n\\' example.txt
Output:
\t\n\
Apple
Banana
Cherry
在此命令中,“1”是插入文本“\t\n”的行号。
由于sed中反斜杠用于转义字符,因此需要使用两个反斜杠()来表示单个反斜杠。
插入变量值和命令替换
您还可以使用 sed 插入变量值或命令输出。
例如,如果要在“example.txt”文件的开头插入当前日期和时间,可以使用以下命令:
sed "1 i\\$(date)" example.txt
Output:
Sun Sep 5 08:21:10 UTC 2023
Apple
Banana
Cherry
在此命令中,1
是输出的行号date
命令已插入。
在特定图案周围插入多条线
如果要插入两行“这是第一行”。和“这是第二行。”在“example.txt”文件中每行包含“Banana”的前后,您可以使用以下命令:
sed -e '/Banana/ i\This is the first line.' -e '/Banana/ a\This is the second line.' example.txt
Output:
Apple
This is the first line.
Banana
This is the second line.
Cherry
在此命令中,“/Banana/”是匹配包含“Banana”的行的模式。
在上面的命令中,第一个-e
选项插入“这是第一行。”在每行包含“Banana”之前,第二个-e
选项附加“这是第二行。”在每行包含“Banana”之后。
处理多个文件
sed
还可以一次处理多个文件,这允许您使用单个命令将文本插入到多个文件中或将不同的文本插入到多个文件中。
例如,如果您想插入“这是一种水果”这一行。在两个文件“example1.txt”和“example2.txt”的开头,您可以使用以下命令:
sed -i '1 i\This is a fruit.' example1.txt example2.txt
在此命令中,“1”是文本“This is a Fruit”所在的行号。被插入到两个文件中。这-i
选项修改适当的文件。