regex 如何在bash中使用sed按节获取ini文件的一部分

q9yhzks0  于 2023-08-08  发布在  其他
关注(0)|答案(3)|浏览(95)

如何使用sed通过节名获取ini文件的一部分。棘手的部分是节名可能有文件路径。
我的ini示例:

[SECTION]
ANYkey=value1
ANYkey2=value2

[test/foo/file.txt]
key=value1
key2=value2

[test/foo/file2.txt]
key3=value3
key4=value4

字符串
检索ini节[test/foo/file.txt]的数据时出现问题
sed或awk之后的预期输出:

key=value1
key2=value2


我已经在下面编码以使用下面的代码获取[SECTION]部分

sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' -e 's/#.*$//' -e 's/[[:space:]]*$//' -e 's/^[[:space:]]*//' -e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" < file.ini | sed -n -e "/^\[SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"


使用sed获取输出,如

ANYkey=value1
ANYkey2=value2


但由于文件路径([test/foo/file.txt]之间的斜线),此逻辑不适用于其他部分

cpjpxq1n

cpjpxq1n1#

  • EDIT2:* 或者按照OP的注解,如果你想获得值作为传递给脚本的参数,然后尝试以下操作。当OP需要将路径详细信息作为参数传递给shell脚本并将其传递给awk程序以获得所需的输出时,应使用。
cat script.ksh
value="$1"
awk -v var="$value" '/^\[/{found=""} $0 ~ var{found=1;next}  found && NF' Input_file

字符串
按如下方式运行脚本,输出将为:

./script.ksh "test/foo/file.txt"
key=value1
key2=value2

  • 编辑:* 基于OP的评论,寻找特定的帕特尝试以下。当OP想要直接传递awk程序本身的路径细节时,应该使用。
awk '/^\[/{found=""} /^\[test\/foo\/file\.txt\]$/{found=1;next} found && NF' Input_file


awk '/^\[/{found=""} $0 == "[test/foo/file2.txt]"{found=1;next} found && NF' Input_file

  • 以上说明:*
awk '                              ##Starting awk program from here.
/^\[/{                             ##Checking if a line starts from [.
  found=""                         ##Nullifying found here.
}
/^\[test\/foo\/file\.txt\]$/{       ##Checking if a line contains [test/foo.... then do following.
  found=1                          ##Setting found here.
  next                             ##next will skip all further statements from here.
}
found && NF                        ##Checking if found is SET and line is NOT empty then print current line.
' Input_file                       ##Mentioning Input_file name here.


根据您所展示的样品,请尝试以下操作。当需要打印[之后的任何部分时,应使用。

awk '/^\[/{found=""} /^\[.*\//{found=1;next} found' Input_file

以上说明:

awk '           ##Starting awk program from here.
/^\[/{          ##Checking if a line starts with [ then do following.
  found=""      ##Nullifying found here.
}
/^\[.*\//{      ##Checking condition if line starts from [ and have / in it for path then do following.
  found=1       ##Setting found to 1 here.
  next          ##next will skip all further statements from here.
}
found           ##If found is set then print current line.
' Input_file    ##Mentioning Input_file name here.

odopli94

odopli942#

$ awk -v sec='[test/foo/file2.txt]' '!NF{f=0} f; $0==sec{f=1}' file
key3=value3
key4=value4

字符串

ie3xauqp

ie3xauqp3#

此解决方案仅使用sed和bash在.ini节中选择一个值。

#!/bin/bash
set -eu

function sed_escape {
    sed -r 's%([/.])%\\\1%g' <<< "$*"
}

SECTION=$(sed_escape "$1")
KEY=$(sed_escape "$2")

sed -rn -e "/^\[${SECTION}\]$/,/^\[.*/ { /^${KEY}=/ s/.*=//p }"

字符串
为了简单起见,我做了一些假设:

  • INI文件中没有多余白色
  • 节名或键名中没有特殊字符,/和除外。
  • INI文件中无注解
jpoittevin@poittevin:~
$./find_ini.sh SECTION ANYkey2 < test.ini 
value2

相关问题