0

我有一个文本文件,我想在文本中间插入更多文本。我有这个输入文本:

[etc....] 
relay_recipient_maps =
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_yoda,
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_luke,
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_rd2d2,
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_c3p0,
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_dark_vador 
[etc...]

在最后一行之后,我想在“dark vador line”之后插入 Anakin,但我不知道如何解决我的问题。

4

4 回答 4

1

这是使用GNU sed. 像这样运行:

sed -f script.sed file.txt

内容script.sed

/relay_recipient_maps =/,/[^,]$/ {

    /relay_recipient_maps =/ n

    /[^,]$/ {
        s/[ \t]*$/,/
        a\                btree:/opt/pmx69/postfix/etc/vdm_valid_users_anakin
    }
}

或者:

/relay_recipient_maps =/,/[^,]$/ {

    /btree.*[^,]$/ {
        s/[ \t]*$/,/
        a\                btree:/opt/pmx69/postfix/etc/vdm_valid_users_anakin
    }
}

结果:

[etc....] 
relay_recipient_maps =
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_yoda,
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_luke,
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_rd2d2,
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_c3p0,
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_dark_vador,
                btree:/opt/pmx69/postfix/etc/vdm_valid_users_anakin
[etc...]
于 2012-10-23T13:34:04.223 回答
0

取决于您使用的外壳。您可以在 bash、zsh 和其他一些工具中执行此操作:

echo "the dark vador line" >> file_with_content.txt

这会将字符串附加到文件的末尾。

于 2012-10-23T13:21:00.967 回答
0

您可以使用 sed:

sed -e '/dark_vador/ s/$/Anakin/' file.txt

对于包含 patterndark_vador的每一行,字符串Anakin将附加到行尾。

如果您只想在第一场比赛中这样做,您可以在附加后退出:

sed -e '/dark_vador/ { s/$/Anakin/; q }' file.txt

sandq命令必须组合在一起,以便它们仅在具有 的行上执行,dark_vador否则q将在读取第一行后退出(即使它不包含dark_vador)。

如果您想在该行之后追加一行dark_vador可以使用以下a命令:

sed -e '/dark_vador/ a\
Anakin' file.txt

这将Anakin在每一行之后创建一个新行dark_vador。如上,如果您只想在第一个匹配后添加一行,则可以退出:

sed -e '/dark_vador/ { a\
Anakin
q }' file.txt

希望这会有所帮助=)

于 2012-10-23T13:33:12.857 回答
0

这是一个 GNU sed 替代方案:

sed '/^relay_recipient_maps/,/[^,]$/{/btree:.*[^,]$/s##&,\n btree:/opt/pmx69/postfix/etc/vdm_valid_users_Anakin#}' file.txt

这个怎么运作:

对于以“relay_recipient_maps”开头的块,以及直到不以逗号结尾的所有后续行,然后用相同的替换不以逗号结尾的“btree:”行(这将是“relay_recipient_maps”块中的最后一个btree)行加“,”和所需的新行。

这假设“relay_recipient_maps”块总是以 btree 结尾:行不以“,”结尾

于 2012-10-23T18:05:05.217 回答