如何在linux shell脚本中获取所需字符串
我需要删除除“[]”字符中带的字符串以外的所有行如何在linux shell脚本中获取所需字符串,linux,bash,awk,sed,grep,Linux,Bash,Awk,Sed,Grep,我需要删除除“[]”字符中带的字符串以外的所有行 输入文件:ODBC.ini [ODBC Data Sources] odbcname = MyODBC 3.51 Driver DSN [odbcname] Driver = /usr/lib/odbc/libmyodbc.so Description = MyODBC 3.51 Driver DSN [Default] [ODBC Data Sources] [odbcname] [Default] 预期输出:
输入文件:ODBC.ini
[ODBC Data Sources]
odbcname = MyODBC 3.51 Driver DSN
[odbcname]
Driver = /usr/lib/odbc/libmyodbc.so
Description = MyODBC 3.51 Driver DSN
[Default]
[ODBC Data Sources]
[odbcname]
[Default]
预期输出:ODBC.ini
[ODBC Data Sources]
odbcname = MyODBC 3.51 Driver DSN
[odbcname]
Driver = /usr/lib/odbc/libmyodbc.so
Description = MyODBC 3.51 Driver DSN
[Default]
[ODBC Data Sources]
[odbcname]
[Default]
删除此旧dsn后,还需要使用不同的dsn名称。
提前感谢
sed
已就位(-i
)编辑:
匹配具有\[[^]]*\]
[]
匹配空行或仅包含空格的行^[:blank:][]*$
删除不匹配的行!d
awk
中打印匹配的行:
awk '/\[[^]]*\]|^[[:blank:]]*$/' ODBC.ini
最近的GNUawk
具有就地编辑选项:
awk -i inplace '/\[[^]]*\]|^[[:blank:]]*$/' ODBC.ini
POSIX ly:
awk '/\[[^]]*\]|^[[:blank:]]*$/' ODBC.ini >ODBC_temp.ini && mv ODBC{_temp,}.ini
示例:
$ sed -E '/\[[^]]*\]|^[[:blank:]]*$/ !d' file.txt
[ODBC Data Sources]
[odbcname]
[Default]
$ awk '/\[[^]]*\]|^[[:blank:]]*$/' file.txt
[ODBC Data Sources]
[odbcname]
[Default]
如果这不是您所需要的全部:
$ grep '\[' file
[ODBC Data Sources]
[odbcname]
[Default]
然后编辑您的问题,以提供更具代表性的样本输入/输出。使用grep:
打印从[
开始的行以及之后的所有内容,直到到达第一个]
grep -oP '^\[.*?]' infile
[ODBC Data Sources]
[odbcname]
[Default]
使用awk
:
awk -F'[|]' '/^\[/{print $1}' infile
[ODBC Data Sources]
[odbcname]
[Default]
您可以使用
awk
。以下awk
程序匹配包含[括号中的值]
的行或空行
awk '/^\[.*]$/ || /^$/' file
输出:
[ODBC Data Sources]
[odbcname]
[Default]
grep“\[.\]”input.txt
删除这个旧的后还需要不同的dsn名称
-不知道这意味着什么…Jean-François Fabre我需要这个问题的答案非常感谢您花这么多时间来解释这个模式“[^]*]”的工作原理。@Subakank当然。在\[^]*\]
中,\[
匹配文字[
,[^]*
匹配零个或多个字符直到下一个]
,\]
匹配文字]
。抱歉,这是我的错误。“我想清除旧的DSN配置文件,并想添加新的DSN配置文件”。从你的答案来看,我需要以相同的模式添加新的配置文件,而不会干扰[]的内容。寻找答案stackoverflow.com/q/39726811/4087559如果你发布了一个可点击的链接,我可能已经看过了。