首页 > 解决方案 > 用另一个文件内容替换文件中的一行,但在匹配后放置内容 X 行

问题描述

我有一个文件要更新一些新数据。另一个文件中的新数据。我自己已经解决了这个问题。

但是,我的模式匹配后更新的文本需要 7 行

我通过执行 grep -A 7 命令进行了尝试,将其分配给 last_details。

这当然会将 7 行分配给一个变量(我猜是一个列表),所以它会给后面的 sed 带来问题。

last_details=$(grep -A7 ${last_string} /var/tmp/sym_links.ini.$$)
sed "/^${last_details}$/r ${tmp_symlinks_file_part_2}" /var/tmp/sym_links.ini.$$ > /var/tmp/sym_links.ini.$$.tmp2

所以我希望输出从

[DWH_DBSPACES_MAIN_10]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_10]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_11]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

但相反我得到了错误

sed: -e expression #1, char 24: unterminated address regex

标签: bashsedgrep

解决方案


您的问题过于关注您想如何做,因此缺少有关您要做什么的信息。如果您只是想在文件中的其他文本块之后添加一个新的文本块,其中所有块都由空行分隔,那么这是如何做到的:

awk -v RS= -v ORS='\n\n' -F'\n' -v str='[DWH_DBSPACES_MAIN_10]' '
    NR==FNR{new=$0; next} {print} $1==str{print new}
' newstuff file

例如使用这些输入文件:

$ cat file
[DWH_DBSPACES_MAIN_09]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_10]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_12]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

.

$ cat newstuff
[DWH_DBSPACES_MAIN_11]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

我们可以做的:

$ awk -v RS= -v ORS='\n\n' -F'\n' -v str='[DWH_DBSPACES_MAIN_10]' 'NR==FNR{new=$0; next} {print} $1==str{print new}' newstuff file
[DWH_DBSPACES_MAIN_09]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_10]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_11]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_12]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

推荐阅读