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

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
poplarc
帖子: 43
注册时间: 2007-01-20 22:20
来自: 深圳

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

#1

帖子 poplarc » 2009-09-14 15:36

想通过shell脚本分析配置一个文本文件,文件可能包含类似[key_word]这样的内容。
其中key_word是不固定的,但都是通过中括号括起来。
现在可以用sed查找到包含key_word的文本行,脚本如下,sed 's/\(\[\)\(.*\)\(\]\)/\2/'
但是不知道能否利用sed为shell变量赋值呢?谢谢! :em06
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

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

#2

帖子 eexpress » 2009-09-14 15:52

grep key_word *
● 鸣学
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

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

#3

帖子 yaoms » 2009-09-14 16:10

grep -o keyword *
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

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

#4

帖子 eexpress » 2009-09-14 16:21

yaoms, 你-o了,那就看傻单词了。
:em04
● 鸣学
头像
poplarc
帖子: 43
注册时间: 2007-01-20 22:20
来自: 深圳

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

#5

帖子 poplarc » 2009-09-14 16:45

eexpress 写了:grep key_word *
我没描述清楚,其实是想搜索所有用中括号括起来的内容,然后将这样的内容赋值给一个变量。应该怎样作呢? :em03
t3swing
帖子: 1028
注册时间: 2008-11-01 21:42
来自: 树下板凳

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

#6

帖子 t3swing » 2009-09-14 17:22

lz还是帖一段你的文本吧,再举个例子,你的要求有点不好理解
其实是想搜索所有用中括号括起来的内容,然后将这样的内容赋值给一个变量
括号括起来的内容有多个,找出来过后,如何赋给一个变量?
cat a.txt |grep -o "\[[^]]*\]" | sed -e "s/\[//" -e "s/\]//"
上次由 t3swing 在 2009-09-14 17:28,总共编辑 1 次。
民族的脊梁,是踏实做事的人,非只知道骂街的泼妇。
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

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

#7

帖子 yaoms » 2009-09-14 17:27

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

代码: 全选

matchword=`grep -o keyword filename`
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
poplarc
帖子: 43
注册时间: 2007-01-20 22:20
来自: 深圳

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

#8

帖子 poplarc » 2009-09-14 17:28

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可以么?
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

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

#9

帖子 HuntXu » 2009-09-14 18:52

代码: 全选

var=`grep -o "\[[^]]*\]" nmc.conf|sed -r 's/\[([^]]+)/\1/'`
这样么?
HUNT Unfortunately No Talent...
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

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

#10

帖子 aerofox » 2009-09-14 19:34

是不是这样

代码: 全选

for keyword in `sed -n 's/.*\[\(.*\)\].*/\1/p' nmc.conf; do
    do_something
done
头像
poplarc
帖子: 43
注册时间: 2007-01-20 22:20
来自: 深圳

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

#11

帖子 poplarc » 2009-09-15 9:05

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/'`
不太明白“\[[^]]*\]”是什么意思。
t3swing
帖子: 1028
注册时间: 2008-11-01 21:42
来自: 树下板凳

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

#12

帖子 t3swing » 2009-09-15 9:52

用这个样子吧 "\[[^]]*\]",\[.*\]这个样子有时有问题,最长匹配原则,如果一行有两个 [ aaa ] [bbb ] 他会匹配 [ aaa bbb]
“\[[^]]*\]” \转义,[^]] 里面不包含 ] 的字符 ,[^]]* 0或多个不包含]的字符 ,shell正则表达式
民族的脊梁,是踏实做事的人,非只知道骂街的泼妇。
头像
poplarc
帖子: 43
注册时间: 2007-01-20 22:20
来自: 深圳

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

#13

帖子 poplarc » 2009-09-15 10:07

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

谢谢大家相助! :em05 :em11
回复