Chinaunix

标题: 如何将a13改为a12? [打印本页]

作者: chzht001    时间: 2007-07-03 17:33
标题: 如何将a13改为a12?
不可用awk 和 perl


注: 是减1操作而不是s/13/12

[ 本帖最后由 chzht001 于 2007-7-3 17:36 编辑 ]
作者: ivhb    时间: 2007-07-03 17:47
a=a13
a1=$(expr "$a" : "[^0-9]*\(.*\)")
a2=$(expr "$a" : "\([^0-9]*\).*")
a=${a2}$((${a1}-1))
作者: ivhb    时间: 2007-07-03 17:47
比较土
作者: 不死幻龙    时间: 2007-07-03 19:26
不是有shift么?
作者: 不死幻龙    时间: 2007-07-03 19:27
...
理解错误
无视我的回复好了
作者: chzht001    时间: 2007-07-03 19:49
原帖由 ivhb 于 2007-7-3 17:47 发表
a=a13
a1=$(expr "$a" : "[^0-9]*\(.*\)")
a2=$(expr "$a" : "\([^0-9]*\).*")
a=${a2}$((${a1}-1))


还是不错的
能用管道并只用一行命令么? tkx

echo a13 | ... ... | ...

[ 本帖最后由 chzht001 于 2007-7-3 20:01 编辑 ]
作者: Edengundam    时间: 2007-07-03 23:41
又看到楼主自虐了...呵呵

expr都用了, 干什么不用a=`expr $a - 1`的...
作者: 網中人    时间: 2007-07-04 01:01
A=a13
echo ${A//[0-9]}$((${A//[!0-9]}-1))
作者: ivhb    时间: 2007-07-04 08:21
原帖由 Edengundam 于 2007-7-3 23:41 发表
又看到楼主自虐了...呵呵

expr都用了, 干什么不用a=`expr $a - 1`的...



bash确实很好,有很多扩展。我用的是sh-posix部分
作者: Edengundam    时间: 2007-07-04 08:55
原帖由 ivhb 于 2007-7-4 08:21 发表



bash确实很好,有很多扩展。我用的是sh-posix部分



呵呵, 看错了, 以为是个数字加减法 没看到前面有a
作者: chzht001    时间: 2007-07-04 09:31
原帖由 網中人 于 2007-7-4 01:01 发表
A=a13
echo ${A//[0-9]}$((${A//[!0-9]}-1))


严重谢谢!!!
就要这样的代码,这是个脚本中用到的类似功能,写几行代码就会使代码很乱,这个很精炼,再次谢谢!!!

在我的机器上成功运行,但在特定的环境中(一个linux小核)运行报错,
Syntax error: bad substitution
好像是子shell不支持格式,不知还有没有其它格式?
运行echo ${A//[0-9]}也报上面的错

[ 本帖最后由 chzht001 于 2007-7-4 09:48 编辑 ]
作者: ivhb    时间: 2007-07-04 10:11
除了bash,对字串的变换操作都很薄弱。
你可能还是需要expr或者类似的东西。
如果引入了那些外部的binary文件来做变换,硬写成一行,效率就会降低。

a=a13
a1=$(expr "$a" : "[^0-9]*\(.*\)")
echo ${a%${a1}}$((${a1}-1))

除非用sh本身字串处理,否则,这个有可能效率最高的了:)

[ 本帖最后由 ivhb 于 2007-7-4 10:15 编辑 ]
作者: Edengundam    时间: 2007-07-04 10:14
原帖由 chzht001 于 2007-7-4 09:31 发表


严重谢谢!!!
就要这样的代码,这是个脚本中用到的类似功能,写几行代码就会使代码很乱,这个很精炼,再次谢谢!!!

在我的机器上成功运行,但在特定的环境中(一个linux小核)运行报错,
Syntax e ...



netman老大的脚本最适合, 经常使用命令的同学, 这种语法本身放在脚本里面, 对于维护人员(几个月后你自己看都不一定明白)是一种噩梦. 简练的语法适用于交互式环境. 用更加明确的语法, 去编写脚本, 才更加合适. 你编写的脚本思路, 可以说特错大错.
作者: ly5066113    时间: 2007-07-04 10:19
try

  1. A=a13
  2. echo ${A%%[0-9]*}$((${A##[!0-9]}-1))
复制代码

作者: 寂寞烈火    时间: 2007-07-04 10:24
awk -v str=A13 'BEGIN{print substr(str,1,1)substr(str,2,length(str))-1}'
作者: ivhb    时间: 2007-07-04 10:29
人好像不让用awk/perl哦
作者: 寂寞烈火    时间: 2007-07-04 10:38
原帖由 ivhb 于 2007-7-4 10:29 发表
人好像不让用awk/perl哦


这个可以吧
echo ${A:0:1}$((${A:1{#A}}-1))

[ 本帖最后由 寂寞烈火 于 2007-7-4 10:55 编辑 ]
作者: 小N哥哥    时间: 2007-07-04 10:46
原帖由 網中人 于 2007-7-4 01:01 发表
A=a13
echo ${A//[0-9]}$((${A//[!0-9]}-1))

网中人大牛的这个,没明白,能不能指点一下,或者你给个相关的文章让小弟学习一下!
致敬!
作者: Edengundam    时间: 2007-07-04 10:53
原帖由 小N哥哥 于 2007-7-4 10:46 发表

网中人大牛的这个,没明白,能不能指点一下,或者你给个相关的文章让小弟学习一下!
致敬!



字符串替换  ${variable//pattern/string}
算术运算     $(())


参考下netman的13问....:wink:


作者: 小N哥哥    时间: 2007-07-04 11:17
呵呵,明白了”//“这个meta字符的作用了!谢谢楼上的
作者: ivhb    时间: 2007-07-04 12:18
原帖由 ly5066113 于 2007-7-4 10:19 发表
try

A=a13
echo ${A%%[0-9]*}$((${A##[!0-9]}-1))



great
作者: chzht001    时间: 2007-07-04 13:02
原帖由 ly5066113 于 2007-7-4 10:19 发表
try

A=a13
echo ${A%%[0-9]*}$((${A##[!0-9]}-1))


good
作者: chzht001    时间: 2007-07-04 13:05
原帖由 Edengundam 于 2007-7-4 10:14 发表



netman老大的脚本最适合, 经常使用命令的同学, 这种语法本身放在脚本里面, 对于维护人员(几个月后你自己看都不一定明白)是一种噩梦. 简练的语法适用于交互式环境. 用更加明确的语法, 去编写脚本, 才更加合 ...



那要看你的脚本运行环境,就像你用C语言或汇编写程序,要看你写的是核心处的程序还是普通程序,追求的目标不一样啊
作者: 網中人    时间: 2007-07-04 17:01
是啊,shell 不同版本,在 meta 的處理上也很不一樣。
我一般是以 linux 的 default shell (bash) 來做例子。
如果用別的 shell,我會特別聲明的。

字串與整數的處理,在 shell 上的方法很多。
且 data 的格式是固定與否,那 code 的兼容度也有很大差別。
作者: newsecond    时间: 2007-07-05 09:31
A=a13
echo ${A/%[0-9]/2}

[ 本帖最后由 newsecond 于 2007-7-5 09:41 编辑 ]
作者: 網中人    时间: 2007-07-05 14:02
原帖由 newsecond 于 2007-7-5 09:31 发表
A=a13
echo ${A/%[0-9]/2}

那如果是 A=a14 要變 a13 呢?
不用公式的話,直接 echo a12 就好了啊,是不?
作者: ivhb    时间: 2007-07-05 14:44
学到了
[!0-9],我一直以为是不能这么做的。
其实早应该想到了
匹配多个用的是*而不是用.*,应该用的是文件名匹配的法则。

多谢那个哥们:)
作者: newsecond    时间: 2007-07-05 15:36
原帖由 網中人 于 2007-7-5 14:02 发表

那如果是 A=a14 要變 a13 呢?
不用公式的話,直接 echo a12 就好了啊,是不?


呵呵


thanks.......




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2