2

我有两个文件,都包含数万行。我目前正在从file_one.txt获取一个字符串( Z1234562)并尝试查看它是否在file_two.txt上。如果在file_two.txt上找到它,我将返回匹配所在的行号——在本例中为第 1235 行。我已经有这个工作了。

file_one.txt
Line 1> [...]_Z1234562

file_two.txt
Line 1234> [...],Z1234561,[...]
Line 1235> [...],Z1234562,[...]
Line 1236> [...],Z1234563,[...]

但是,我现在想将字符串,Yes附加到第 1235 行。所以在 file_two.txt 我有

Line 1235> [...],Z1234562,[...],Yes

在 Glenn Jackman 对另一个问题的回答的帮助下,能够弄清楚如何在文件中的特定行之前之后使用 ed 编辑器添加文本。但是,我无法弄清楚是否可以使用 ed 将文本添加到文件中的行。阅读文档我不确定是否存在。到目前为止,基于这个 AIX站点,这就是我所拥有的:

(echo '15022a'; echo 'Text to add.'; echo '.'; echo 'w'; echo 'q') | ed -s filename.txt

这会附加要添加的字符串文本。在第 15,022 行之后。我想知道是否有与此附加等效的插入。

我不使用 sed 的原因是因为我在 AIX 系统上,我似乎无法了解这个论坛的工作。但是,我不确定这个论坛中的 sed 命令是否只解决在一行之前或之后添加文本而不是在行尾添加文本,我已经在使用它了。

我的下一个方法是删除我想要追加到的行末尾的返回字符,追加,然后重新添加返回字符,但我不想在用尽我的选择之前重新发明轮子。也许我错过了一些东西,因为我想尽快做到这一点,但任何帮助将不胜感激。我开始不喜欢这些 AIX 系统了。也许 awk 可以帮助我,但我对 awk 不太熟悉。

我使用 Perl 编写了一个小的二进制搜索子例程,以便找到我想要附加到的行。我不确定 sed、ed、grep、awk 等是否使用二进制搜索,但这就是为什么我不使用 ed 或 sed 的模式替换搜索。我希望它尽可能快,所以我对不同的方法持开放态度。

4

3 回答 3

3

这是我用于ed从脚本调用的通用配方:

(echo '/pattern/s/$/ new text/'
 echo w ) | ed filename

这将调用edon filename,搜索包含 的行,并在该行的末尾pattern附加“ ”。new text调味。

你说你遇到了麻烦sed,但为了记录,这是使用相同的东西sed

sed '/pattern/s/$/ new text/' filename > filename.modified
于 2016-10-21T23:10:38.670 回答
1

你可以使用j命令

(.,.+1)j 加入寻址线。寻址的行从缓冲区中删除,并替换为包含其连接文本的单行。当前地址设置为结果行。

所以你只需要修改你以前的命令:

cat << EOF | ed -s filename.txt
15022a
Text to add.
.
-1,.j
wq
EOF
于 2016-11-03T14:59:53.167 回答
0

首先我们创建一个测试文件foo

$ cat > foo
foo
bar

如果您已经知道要编辑的行号,例如前面的示例和行号 2,请使用sed

$ sed '2s/$/foo' foo
foo
barfoo

awk你的命令中:

$ awk 'NR==2 {sub(/$/,"foo")} 1' foo
foo
barfoo

perl

$ perl -p -e 's/$/foo/ if $. == 2' foo
foo
barfoo
于 2016-10-22T12:50:24.127 回答