提取字符串的问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

提取字符串的问题

#1

帖子 chengmoYS » 2012-03-21 10:46

我现在在写shell脚本要对一些结果进行处理
形如

scsi.vendor = 'hp' (string)
scsi.model = 'DVDROM DH20N' (string)
info.product = 'SCSI Device' (string)

我现在要得到''内的字符串,分别赋值给对应的变量
vendor=hp
model="DVDROM DH20N"
product="SCSI DEVICE"


我使用的是 awk '{print $3}' | sed 's/\x27//g'
得到的model是DVDROM
product是SCSI

没有预期效果


另外还有个问题
使用find 我想找到当前目录下的所有文件类型的相对这个当前目录的相对路径

就是说 使用find 得到每个文件类型的相对路径地址 以便处理

使用find时 也要考虑那些文件含有空格字符的情况 这个有些麻烦
使用find ./ -print0和xargs -0来处理
但是得到的是 一个目录 和该目录下文件的列表
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 提取字符串的问题

#2

帖子 aerofox » 2012-03-21 13:12

第一个问题就不要 awk 和 sed 并用了,用其中之一就行了。

代码: 全选

sed "s/\([^ ]*\) = '\([^']*])'.*/\1=\2/" 
我假定源文件中每个等号前后都恰好有一个空格,如果不是这种情况,只需把等号前后的空格改改就行了,例如换成“ *”

第二个问题没太看懂要求。
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: 提取字符串的问题

#3

帖子 chengmoYS » 2012-03-21 13:27

第二个问题就是
给我一个目录
进入该目录
我就得到 该目录下的所有文件 (包括 -f -d -b -c -S -p -h)
./xxx/yyyy
./xxxxx/yyyyy
./xxxxxxx/yyyy\ cccc
或者格式大致相似 可以提取相对路径


楼上的大哥,你那个sed好像不太行
[root@dt3 ~]# echo "a = 'b c' (c)" | sed "s/\([^ ]*\) = '\([^']*])'.*/\1=\2/"
sed: -e expression #1, char 34: Unmatched ( or \(
bash: echo: write error: Broken pipe
[root@dt3 ~]#
zcf115
帖子: 398
注册时间: 2009-06-28 10:06
系统: ubuntu12.04

Re: 提取字符串的问题

#4

帖子 zcf115 » 2012-03-21 13:27

chengmoYS, 可不可以改下awk的默认分割符,改为 = 为分割符,显示$2,再利用sed去掉‘ ?
Still Alive
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: 提取字符串的问题

#5

帖子 chengmoYS » 2012-03-21 13:58

scsi.vendor = 'hp' (string)
scsi.model = 'DVDROM DH20N' (string)
info.product = 'SCSI Device' (string)

=作为分割符,$2就是'hp' (string),和 'SCSI Device' (string) 的
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 提取字符串的问题

#6

帖子 eexpress » 2012-03-21 14:29

awk sed 都可以设置分隔符。

只是这些,最好perl改。玩正则嘛。
● 鸣学
zcf115
帖子: 398
注册时间: 2009-06-28 10:06
系统: ubuntu12.04

Re: 提取字符串的问题

#7

帖子 zcf115 » 2012-03-21 18:16

神又来推销perl了。 :em04
Still Alive
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 提取字符串的问题

#8

帖子 fnan » 2012-03-21 21:06

sed -r 's/.*\.(\S+).*\x27(.*)\x27.*/\1="\2"/' file
eval "$(sed -r 's/.*\.(\S+).*\x27(.*)\x27.*/\1="\2"/' file)"
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 提取字符串的问题

#9

帖子 fnan » 2012-03-21 21:15

第二个问题其实是不搜索当前目录下的目录的文件吧,如果这样加上-maxdepth 1即可。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 提取字符串的问题

#10

帖子 aerofox » 2012-03-22 6:04

chengmoYS 写了: 楼上的大哥,你那个sed好像不太行
[root@dt3 ~]# echo "a = 'b c' (c)" | sed "s/\([^ ]*\) = '\([^']*])'.*/\1=\2/"
sed: -e expression #1, char 34: Unmatched ( or \(
bash: echo: write error: Broken pipe
[root@dt3 ~]#
第二 ) 前是反斜杠,打字时手指偏了,没注意。

代码: 全选

echo "a = 'b c' (c)" | sed "s/\([^ ]*\) = '\([^']*\)'.*/\1=\2/"
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 提取字符串的问题

#11

帖子 aerofox » 2012-03-22 6:20

用 awk 的例子

代码: 全选

echo "a = 'b c' (c)" | awk -F "( = |')" '{print $1=$3}'
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: 提取字符串的问题

#12

帖子 chengmoYS » 2012-03-22 9:29

fnan 写了:第二个问题其实是不搜索当前目录下的目录的文件吧,如果这样加上-maxdepth 1即可。
要递归目录

后来干脆就用
find ./ -type f等
把所有支持的7个文件类型都搜出来 就是要的结果

本来是想图简便的
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: 提取字符串的问题

#13

帖子 chengmoYS » 2012-03-22 9:31

谢谢 fnan 和 aerofox 的热心解答 又学到了
看来得多看多实践呀
回复