Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux shell脚本中获取所需字符串_Linux_Bash_Awk_Sed_Grep - Fatal编程技术网

如何在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
最近的GNU
awk
具有就地编辑选项:

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如果你发布了一个可点击的链接,我可能已经看过了。