提问人:Ali 提问时间:9/25/2023 最后编辑:Ali 更新时间:9/26/2023 访问量:43
sed - 将当前分配给变量的值替换为文件中的用户输入
sed - replace currently assigned value to a variable with user input in a file
问:
我正在尝试更新文件中分配的变量值,但它不起作用。
例如,当前分配的值为:sga_target=3GB,<<--只需要更新数字,GB 应该保留。
注意:每个变量赋值后都有一个逗号,如下所示:
initParams=undo_tablespace=UNDOTBS1,sga_target=3GB,db_block_size=8192BYTES,nls_language=AMERICAN,dispatchers=(PROTOCOL=TCP)(SERVICE=I00SBXSBXXDB),diagnostic_dest={ORACLE_BASE},control_files=("{ORACLE_BASE}/oradata/{DB_UNIQUE_NAME}/control01.ctl","/u02/fast_recovery_area/{DB_UNIQUE_NAME}/control02.ctl"), remote_login_passwordfile=EXCLUSIVE,audit_file_dest=ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/adump,processes=320,pga_aggregate_target=2GB,nls_territory=AMERICA,local_listener=LISTENER_I00SBX,db_recovery_file_dest_size=50GB,open_cursors=300,log_archive_format=%t_%s_%r.arc,db_domain=TEST.COM,compatible=19.0.0,db_name=I00SBX,db_recovery_file_dest=/u03/fast_recovery_area/{DB_UNIQUE_NAME},audit_trail=db
我尝试了以下 sed 代码,同时牢记逗号分隔值,但它没有将数字更新为用户输入值。不知道我做错了什么。
sed -i 's/\(sga_target\)=[^,]*\1="${sga_target}/GB"/g' dbca2.rsp
答:
2赞
Gilles Quénot
9/25/2023
#1
使用 Perl 的单行代码,这是在类固醇上:sed
perl -i -spe 's/\b(sga_target=)\d+GB\b/$1$sga_target/' -- -sga_target=12GB file
用:sed
sga_target=12GB
sed -i -E "s/\b(sga_target=)[[:digit:]]+GB\b/\1$sga_target/" file
正则表达式匹配如下:
节点 | 解释 |
---|---|
\b |
单词 char (\w) 与非单词 char 锚点之间的边界锚点 |
( |
分组并捕获到 \1: |
sga_target= |
'sga_target=' |
) |
\1 结束 |
[[:digit:]]+ |
以下任何字符:数字(如 \d)(1 次或更多次(匹配尽可能多的数量)) |
GB |
“GB” |
\b |
单词 char (\w) 与非单词 char 锚点之间的边界锚点 |
评论
0赞
Ali
9/25/2023
似乎由于某种原因没有将 GB 添加回来。更新后仅保留数字。
0赞
Gilles Quénot
9/25/2023
您需要在变量中添加 GB。或者稍微适应一下。
0赞
Ali
9/25/2023
这将自动添加 GB: sed -i -E “s/\b(sga_target=)[[:d igit:]]+GB\b/\1$sga_target\GB/”
评论