用另一个文件内容替换文件中的一行,但在匹配后放置内容X行

时间:2019-06-28 10:54:04

标签: bash sed grep

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

但是,我的模式匹配后,更新后的文本必须为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

2 个答案:

答案 0 :(得分:0)

您的问题太着重于您想如何做,因此缺少有关您要做什么的信息。如果您只是想在文件中所有其他文本块之间用空白行分隔的其他文本块之后添加一个新的文本块,则可以这样做:

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=

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed '/\[DWH_DBSPACES_MAIN_10\]/!b;:a;N;s/\n/&/7;Ta;r insertFile' file

将焦点放在要匹配的行上。通过引入循环来添加七行,然后添加所需的文件。在将插入的文件放入输出流之前,将打印出模式空间。

引入的循环利用了以下事实:当将一行附加到模式空间时,会在其前面添加换行符。因此,可以通过以下方式来创建命题:单独(或不替换)换行符,并使用测试t进行成功替换,或者在这种情况下使用T进行相反的替换。