仅在大于时才替换值

kpw*_*kpw 2 linux bash shell awk sed

尝试使用shell命令替换大量文件中的值(在脚本中使用以迭代目录中的文件).

Input file examples:

file1:
019=False
051=Limited
051>Limited Lease Time=2419200

file2:
019=False
051=Limited
051>Limited Lease Time=14400
Run Code Online (Sandbox Code Playgroud)

这工作没问题:

sed -e '/Limited Lease Time=/s/[0-9]\+$/86400/g' <infile >outfile

# cat outfile
019=False
051=Limited
051>Limited Lease Time=86400
Run Code Online (Sandbox Code Playgroud)

但是......然后意识到我正在替换任何值,包括低于86400的值,当时我只想更换大于86400的任何值.

我以为我可以使用awk,这种'有点'工作,因为在输出中只有'限制租用时间'行,其值> 86400:

awk -F= '/Limited Lease Time/ && $2 > 86400 { print $2 }'
Run Code Online (Sandbox Code Playgroud)

但是......它只输出匹配的行,而我需要原始输出(示例中为3行),包括修改,如果匹配值> 86400.

感谢一些处理这个问题的建议!

Ini*_*ian 5

使用=字段分隔符Awk并获取$2大于您设置的值的行,

awk 'BEGIN{FS=OFS="="} $0 ~ /\<Limited Lease Time\>/ && $2 > 86400 {$2=86400}1' file
Run Code Online (Sandbox Code Playgroud)

对于输入文件,

cat file
019=False
051=Limited
051>Limited Lease Time=14400
051>Limited Lease Time=94400
051>Limited Time=14400
Run Code Online (Sandbox Code Playgroud)

运行该命令可根据需要生成输出.

awk 'BEGIN{FS=OFS="="} $0 ~ /\<Limited Lease Time\>/ && $2 > 86400 {$2=86400}1' file
019=False
051=Limited
051>Limited Lease Time=14400
051>Limited Lease Time=86400
051>Limited Time=14400
Run Code Online (Sandbox Code Playgroud)

您也可以使用-v变量import in 进行配置Awk

awk -v thresh=86400 'BEGIN{FS=OFS="="} $0 ~ /\<Limited Lease Time\>/ && $2 > thresh {$2=thresh}1' file
Run Code Online (Sandbox Code Playgroud)