免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cao627
打印 上一主题 下一主题

[文本处理] sed 替换中变量展开的疑问 [复制链接]

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
11 [报告]
发表于 2013-01-26 11:24 |只看该作者
回复 9# blackold


b="b
b"
echo $b
显示b b

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
12 [报告]
发表于 2013-01-26 11:42 |只看该作者
回复 11# cao627
  1. $ echo $b
复制代码
此时 $b 不在双引号中,结果为 b b
sed 命令中的 $b 是在双引号中的,结果就不一样了。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
13 [报告]
发表于 2013-01-26 12:18 |只看该作者
回复 12# blackold

此时 $b 不在双引号中,结果为 b b
sed 命令中的 $b 是在双引号中的



单我还是不赞同你9楼的观点!

这么说吧
  1. test$b="b
  2. b"
  3. test$echo aaa"b{b}"aaa
  4. aaab
  5. baaa
复制代码
如果按照9楼的分析
echo aaa"b{b}"aaa 会  先被shell解释成如下两行:
echo aaab
baaa
那么结果就是:
先执行:
echo aaab #输出aaab
再执行:
baaa      #找不到baaa这条命令



论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
14 [报告]
发表于 2013-01-26 12:22 |只看该作者
回复 13# cao627


    你是不是打错了?
echo aaa"b{b}"aaa


为什么会解释成两行?

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
15 [报告]
发表于 2013-01-26 14:18 |只看该作者
本帖最后由 cao627 于 2013-01-26 14:21 编辑

回复 14# blackold
没有被分成两行啊

我是说按照9楼的分析
如果 b="b
b"
   应该是变成了 sed 's/a/b
b/g'
分成两行了。

那么:
echo aaa"${b}"aaa
岂不变成:
echo aaab
baaa
结果出现出现找不到baaa命令的错误输出?

所以:
sed s/a/"$b"/g a.txt 或 sed "s/a/$b/g" a.txt  的执行错误
不是由于9楼分析的原因造成的,即:
sed s/a/"$b"/g a.txt 经过变量展开,不会变成
sed s/a/b
b/g a.txt




   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
16 [报告]
发表于 2013-01-26 14:26 |只看该作者
回复 15# cao627


    1. 你前面打错了。


    2. 如果
b="b
b"

那么
  1. echo aaa"${b}"aaa
复制代码
解释后确实是两行。因为b本身有换行符。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
17 [报告]
发表于 2013-01-26 14:33 |只看该作者
回复 16# blackold
解释后确实是两行。因为b本身有换行符。

不对吧?
如果
echo aaa"${b}"aaa
解释后变成
echo aaab
baaa
于是shell
先执行echo aaab
输出aaab
再执行baaa
输出找不到baaa这条命令。



   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
18 [报告]
发表于 2013-01-26 14:36 |只看该作者
回复 17# cao627

那只是相当于
  1.     $ echo aaaa"b
  2. > baaaa"
  3. aaaab
  4. baaaa
复制代码
换行符被引用了,没有执行命令的含义了。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
19 [报告]
发表于 2013-01-26 16:15 |只看该作者
本帖最后由 cao627 于 2013-01-26 16:21 编辑

回复 18# blackold

你只在说相当于,我在找变量展开后后的实际形式。

我感到我们说到了一个有点困难说清的问题
让我梳理一下:
我们在讲shell的变量展开:
如果:b="b b"
我们会说:echo aaa"${b}"bbb是表像   经变量展开,shell实际的执行语句是:echo aaab baaa
(其实这是一种错误的潜意识。)
那么如果
b="b
b"
按照上面的思路
echo aaa"${b}"bbb   经过变量展开 shell实际的的执行语句是:
用什么来代替这个实际的执行语句成了一个困难。
echo aaab
baaa

显然是不对的。


至于echo aaa"b
baaa"

只是在用另一中表象在表达:echo aaa"${b}"bbb
总不能说 echo aaa"${b}"bbb  经变量展开,shell实际的执行语句是:
echo aaa"b
baaa"
吧?

其实这是实质表象关系混淆的结果
我们在shell终端看到的shell语句都是表象,包括echo aaab baaa,只是它是最简表象。最简表象的含义是不能再缩写和不增体积的情况下改写以表达相同的含义
但有些命令的实质不存在最简表象,如那个。只能以复杂表象表示,如:
echo aaa"b
baaa"
来表示。它可以有不增体积的变化,如:
echo a"aab
baa"
表示一样的实质。因为这样,所以他不是最简表象。
如果我们被错误的潜意识迷惑了,就会在找不到最简表象的情况下感到矛盾和混乱。
   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
20 [报告]
发表于 2013-01-26 16:35 |只看该作者
回复 19# cao627


    没有你想象的那么复杂。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP