分页: 1 / 1

如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-14 15:36
poplarc
想通过shell脚本分析配置一个文本文件,文件可能包含类似[key_word]这样的内容。
其中key_word是不固定的,但都是通过中括号括起来。
现在可以用sed查找到包含key_word的文本行,脚本如下,sed 's/\(\[\)\(.*\)\(\]\)/\2/'
但是不知道能否利用sed为shell变量赋值呢?谢谢! :em06

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-14 15:52
eexpress
grep key_word *

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-14 16:10
yaoms
grep -o keyword *

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-14 16:21
eexpress
yaoms, 你-o了,那就看傻单词了。
:em04

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-14 16:45
poplarc
eexpress 写了:grep key_word *
我没描述清楚,其实是想搜索所有用中括号括起来的内容,然后将这样的内容赋值给一个变量。应该怎样作呢? :em03

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-14 17:22
t3swing
lz还是帖一段你的文本吧,再举个例子,你的要求有点不好理解
其实是想搜索所有用中括号括起来的内容,然后将这样的内容赋值给一个变量
括号括起来的内容有多个,找出来过后,如何赋给一个变量?
cat a.txt |grep -o "\[[^]]*\]" | sed -e "s/\[//" -e "s/\]//"

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-14 17:27
yaoms
eexpress 写了:yaoms, 你-o了,那就看傻单词了。
:em04
啥啊,看人家的要求:
poplarc 写了:
eexpress 写了:grep key_word *
我没描述清楚,其实是想搜索所有用中括号括起来的内容,然后将这样的内容赋值给一个变量。应该怎样作呢? :em03
这样保存进变量。

代码: 全选

matchword=`grep -o keyword filename`

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-14 17:28
poplarc
t3swing 写了:lz还是帖一段你的文本吧,再举个例子,你的要求有点不好理解
其实是想搜索所有用中括号括起来的内容,然后将这样的内容赋值给一个变量
括号括起来的内容有多个,找出来过后,如何赋给一个变量?
好建议。比如说文本文件可能是这样的。
我希望我的脚本能够逐行分析这个文本文件,并从中找到中括号括起来部分进行特殊处理。不过不是同时将bedroom1~other rooms赋值给一个变量了,而是一个循环过程,每次循环将bedroom1或者other rooms赋值给一个变量并进行处理,直到处理完所有的room。

代码: 全选

[bedroom 1]
192.168.0.11
192.168.0.12
[bedroom 2]
192.168.0.21
[living room]
192.168.0.31
[kitchen]
192.168.0.41
[other rooms...]
192.168.0.xx
在参考了t3swing和yaoms给出的建议之后,发现可以通过如下脚本从文本文件中过滤所有包含中括号的行,并且将过滤所得结果赋值给变量了。

代码: 全选

#! /bin/bash
var=`grep -o "\[[^]]*\]" nmc.conf`
echo "$var"
但进一步的问题是,如何能将变量两边的中括号去掉呢?通过sed可以么?

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-14 18:52
HuntXu

代码: 全选

var=`grep -o "\[[^]]*\]" nmc.conf|sed -r 's/\[([^]]+)/\1/'`
这样么?

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-14 19:34
aerofox
是不是这样

代码: 全选

for keyword in `sed -n 's/.*\[\(.*\)\].*/\1/p' nmc.conf; do
    do_something
done

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-15 9:05
poplarc
HuntXu 写了:

代码: 全选

var=`grep -o "\[[^]]*\]" nmc.conf|sed -r 's/\[([^]]+)/\1/'`
这样么?
根据HuntXu的提示,稍微改了改,像下面这个样子,发现可以了:

代码: 全选

var=`grep -o "\[[^]]*\]" nmc.conf | sed -r 's/(\[)(.*)(\])/\2/'`
而且又试了一下,发现其实grep的匹配模式也可以改改,像下面这个样子也是可行的:

代码: 全选

var=`grep -o "\[.*\]" nmc.conf | sed -r 's/(\[)(.*)(\])/\2/'`
不太明白“\[[^]]*\]”是什么意思。

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-15 9:52
t3swing
用这个样子吧 "\[[^]]*\]",\[.*\]这个样子有时有问题,最长匹配原则,如果一行有两个 [ aaa ] [bbb ] 他会匹配 [ aaa bbb]
“\[[^]]*\]” \转义,[^]] 里面不包含 ] 的字符 ,[^]]* 0或多个不包含]的字符 ,shell正则表达式

Re: 如何通过脚本获取文本文件中的部分内容?

发表于 : 2009-09-15 10:07
poplarc
t3swing 写了:用这个样子吧 "\[[^]]*\]",\[.*\]这个样子有时有问题,最长匹配原则,如果一行有两个 [ aaa ] [bbb ] 他会匹配 [ aaa bbb]
“\[[^]]*\]” \转义,[^]] 里面不包含 ] 的字符 ,[^]]* 0或多个不包含]的字符 ,shell正则表达式
啊,明白了。原来方括号里面的^意思是除了指定字符之外的字符。多谢。

谢谢大家相助! :em05 :em11