0

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

但是,我的模式匹配后更新的文本需要 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
4

2 回答 2

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=
于 2019-06-28T15:45:16.407 回答
0

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

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

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

NB 引入的循环利用了这样一个事实,即当将一行附加到模式空间时,会附加一个换行符。因此,可以通过自己替换换行符(或不替换)并使用测试t成功替换或在这种情况下T为相反的情况来制造命题。

于 2019-06-29T12:27:56.650 回答