分页: 1 / 1

提取字符串的问题

发表于 : 2012-03-21 10:46
chengmoYS
我现在在写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来处理
但是得到的是 一个目录 和该目录下文件的列表

Re: 提取字符串的问题

发表于 : 2012-03-21 13:12
aerofox
第一个问题就不要 awk 和 sed 并用了,用其中之一就行了。

代码: 全选

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

第二个问题没太看懂要求。

Re: 提取字符串的问题

发表于 : 2012-03-21 13:27
chengmoYS
第二个问题就是
给我一个目录
进入该目录
我就得到 该目录下的所有文件 (包括 -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 ~]#

Re: 提取字符串的问题

发表于 : 2012-03-21 13:27
zcf115
chengmoYS, 可不可以改下awk的默认分割符,改为 = 为分割符,显示$2,再利用sed去掉‘ ?

Re: 提取字符串的问题

发表于 : 2012-03-21 13:58
chengmoYS
scsi.vendor = 'hp' (string)
scsi.model = 'DVDROM DH20N' (string)
info.product = 'SCSI Device' (string)

=作为分割符,$2就是'hp' (string),和 'SCSI Device' (string) 的

Re: 提取字符串的问题

发表于 : 2012-03-21 14:29
eexpress
awk sed 都可以设置分隔符。

只是这些,最好perl改。玩正则嘛。

Re: 提取字符串的问题

发表于 : 2012-03-21 18:16
zcf115
神又来推销perl了。 :em04

Re: 提取字符串的问题

发表于 : 2012-03-21 21:06
fnan
sed -r 's/.*\.(\S+).*\x27(.*)\x27.*/\1="\2"/' file
eval "$(sed -r 's/.*\.(\S+).*\x27(.*)\x27.*/\1="\2"/' file)"

Re: 提取字符串的问题

发表于 : 2012-03-21 21:15
fnan
第二个问题其实是不搜索当前目录下的目录的文件吧,如果这样加上-maxdepth 1即可。

Re: 提取字符串的问题

发表于 : 2012-03-22 6:04
aerofox
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/"

Re: 提取字符串的问题

发表于 : 2012-03-22 6:20
aerofox
用 awk 的例子

代码: 全选

echo "a = 'b c' (c)" | awk -F "( = |')" '{print $1=$3}'

Re: 提取字符串的问题

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

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

本来是想图简便的

Re: 提取字符串的问题

发表于 : 2012-03-22 9:31
chengmoYS
谢谢 fnan 和 aerofox 的热心解答 又学到了
看来得多看多实践呀