LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1013|回复: 8

[求助]带有空格的字符串的处理

[复制链接]
发表于 2006-12-14 21:25:24 | 显示全部楼层 |阅读模式
场景:
mail/ 下有好多类似
2005 培训kpi .eml(24.4K).msg
fw_.eml
采 够 培训.07.eml(43k).msg
……

目的: 希望渠道.eml前面的字符串


for i in `ls -A mail/`
do
   echo $i
done


存在以下几种情况,
[color="Navy"]1、 echo $i 或 echo "$i"时会以空格分开, 如:
2005
培训kpi
.eml(24.4K).msg


培训.07.eml(43k).msg
fw_.eml


[color="navy"]2、  for i in "`ls -A tst/`"  ,echo $i 时

2005 培训kpi .eml(24.4K).msg 采 够 培训.07.eml(43k).msg fw_.eml

[color="navy"]3、 for  i in "`ls -A tst/`" ,echo "$i" 时

2005 培训kpi .eml(24.4K).msg
采 够 培训.07.eml(43k).msg
fw_.eml

问题:

1、当我要取.eml之前的字符串时,

[color="navy"]尝试 echo ${i%.eml*}会

2005 培训kpi .eml(24.4K).msg 采 够 培训.07.eml(43k).msg fw_

"`ls -A tst/`" 成了一个独立的字符串

[color="navy"]尝试 echo "${i%.eml*}"
2005 培训kpi .eml(24.4K).msg
采 够 培训.07.eml(43k).msg
fw_


[color="navy"]2、for i in `ls -A tst/`;do echo ${i%.eml*};done
2005
培训kpi



培训.07
fw_

[color="Navy"]3、 expr index "$string" ".eml" 这好像只能匹配一个字符,也就是说只会找到第一个"."或"e" "m" "l"出现的位置,如何来准确匹配".eml"的位置呢

现在我有点糊涂了。 我要实现的目的,该如何通过shell实现呢?
发表于 2006-12-14 23:47:17 | 显示全部楼层
  1. ls -1|sed -e 's/.*\(\.eml*\)/\1/'
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-15 00:46:10 | 显示全部楼层

  1. [0 No.2057 huan@huan ~/tmp/sp]$ ls -1
  2. a a.eml.1234
  3. b b.eml.456

  4. [0 No.2058 huan@huan ~/tmp/sp]$ ls -1 | sed 's/\.eml.*//'
  5. a a
  6. b b

  7. [0 No.2059 huan@huan ~/tmp/sp]$

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-15 09:15:15 | 显示全部楼层
似乎有些问题

采 够 培训.07.eml (43k) .msg

如果后面.eml 后面存在空格的话 sed 's/\.eml.*//'
似乎不行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-15 12:02:01 | 显示全部楼层
自己做了下,大概算可以

[PHP]sed 's/\.eml*\s*(*[^\\]*\s*//' | sed 's/\s*(*[
0-9]*\.\s*[^\\]*//' [/PHP]

可以去掉
[PHP].eml (1.45 KB).msg
(3.69 KB).msg[/PHP]这样两种

也请高手多指点

另外的问题, 为何    sed 's/\.eml*\s*[color="Blue"](*[^\\]*\s*//'  这里的[color="blue"]( 不要写成 \( ??
回复 支持 反对

使用道具 举报

发表于 2006-12-15 15:19:55 | 显示全部楼层
目的: 希望渠道.eml前面的字符串
以为你的真正目的是这个。。。晕

"\("与"\)"在sed中有特殊作用,配匹使用。例如:
ls -1 | sed -e 's/\(.*\).eml.*/\1/'

另外,huan的sed应该没有问题吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-15 22:44:34 | 显示全部楼层
回答:
  huan的sed 没有问题,只是不能处理特殊的带有空格的情况

1、

你的意思是 ()  在正则表达式中正常出现的话仅仅代表 ( )这两个括号

如果是以 \(  \) 形式出现,则是
[color="Blue"]( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
这个意思么?

所以sed 's/\.eml*\s*(*[^\\]*\s*//'  我这里要匹配括号( ,所以是不用转义的。是不是这样理解?

2、

另外的一个就是对于echo的用法
在shell脚本中,常常会这样用

for i in `more file1.txt`
do
  echo $i
done

但是其实这里是有一个问题我现在还不理解的。 如果file1.txt中 有这样的行
1 TSTSTGAG
2 TATATALLL
1 AGGG

那么其实 echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割
那么如果是这样的进行的话
  for i in `more file1.txt`
do
  echo $i | awk '{print $1}' |more
done

似乎是获取不到想要的结果,也就是说echo 把 1 TSTSTGAG 拆开了

1
ttttata
2
tatata
1
llllga
1
gagag
4
algagl

要实现
1
2
1
1
4
这样的结果呢?
[color="Blue"]这里也就是一个如何将文本中的一行传递个一个变量,然后像一般的echo | cmd 这样的处理,如何避免被空格干扰

for i in "`more file1`"; do echo "$i" | awk '{print $1}' |more; done
却可以正常获得,但是我还是不是很明白,该不该用echo
回复 支持 反对

使用道具 举报

发表于 2006-12-16 11:54:21 | 显示全部楼层
for i in "`more file1`"; do echo "$i" | awk '{print $1}' |more; done
其后面的awk & more命令没什么用,暂略。

for i in `more file1`;do echo "$i";done
`more file1`输出为一列表[以空格分,记:n维],for循环使"i"变量依次读取n次,即echo执行了n次,结果显然就会是一行一个列表元素了。

而"`more file1`"的for循环中,由于引号的作用,`more file1`的输出被整体赋值给"i"变量,所以echo命令也只执行了一次而已。

echo $i 与 echo "$i"
bash中,换行符会被当作空格处理,而echo以引用变量形式执行对象时,会保留对象中的空格。
  1. ~$ i="a b  c   d"
  2. ~$ echo $i
  3. a b c d
  4. ~$ echo "$i"
  5. a b  c   d
复制代码

对于换行符,也是类似的情况了。
  1. ~$i="a b
  2. >c"
  3. ~$echo "$i"
  4. a b
  5. c
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-18 15:35:37 | 显示全部楼层
Post by mantou
似乎有些问题

采 够 培训.07.eml (43k) .msg

如果后面.eml 后面存在空格的话 sed 's/\.eml.*//'
似乎不行


什么叫似乎不行呀
用代码说话

  1. huanlf@huanlf-desktop:/tmp/test$ touch '采 够 培训.07.eml (43k) .msg'
  2. huanlf@huanlf-desktop:/tmp/test$ touch '采 够 培训.07.eml      (43k)    .    m s g'
  3. huanlf@huanlf-desktop:/tmp/test$ ls -1
  4. 采 够 培训.07.eml      (43k)    .    m s g
  5. 采 够 培训.07.eml (43k) .msg
  6. huanlf@huanlf-desktop:/tmp/test$ ls -1 | sed 's/\.eml.*//'
  7. 采 够 培训.07
  8. 采 够 培训.07
  9. huanlf@huanlf-desktop:/tmp/test$
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表