免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
31 [报告]
发表于 2013-01-27 14:25 |只看该作者
本帖最后由 blackold 于 2013-01-27 14:29 编辑

回复 30# cao627

   
    shell是有引号的(单引号和双引号)。只是解释后把某些双引号去掉了。
请问:你如何在命令提示符后输入echo命令(输入表象),使他输出两行输出(输出表象)。

    不知道你说的"表象"是什么含义。
使echo 输出的两行的方法很多,比如
  1. echo -e "\n\n"
复制代码

论坛徽章:
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
32 [报告]
发表于 2013-01-27 14:50 |只看该作者
回复 29# blackold


   
最后的双引号(或单引号)只是为了表示上的方便,实际上是没有双引号(或单引号)的


我觉的前半句不大对。

在shell 命令行上输入表象
echo "b
b"
对应shell执行输出表象
b
b
但你不能用其他表象对应shell输出表象
b
b
所以"这个表象是有意义的,不是表象为了表达的方便,而是表象表达的必要
当然"这些只是表象层面上的必要。
想象如果你能和shell“心灵”沟通,“给我echob换行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
33 [报告]
发表于 2013-01-27 15:04 |只看该作者
回复 31# blackold

    不知道你说的"表象"是什么含义


echo "\n\n"
"是表象  \和n也是表象
你将三者组合在一起才在对shell说”给我echo两空行“
如果你去掉"这个表象
那么echo \n\n 在对shell说“给我echo 一个\一个n一个\一个n “

所以表象不同,意义不同

我们永远在表象上讨论问题,但和表象对应有一个实际含义。



论坛徽章:
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
34 [报告]
发表于 2013-01-27 16:31 |只看该作者
回复 32# cao627


    我还理解不了你所说的表象。


   但你不能用其他表象对应shell输出表象
b
b
  1. $ echo -e b\\nb
  2. b
  3. 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
35 [报告]
发表于 2013-01-27 16:40 |只看该作者
回复 33# cao627


    感觉你说的"表象"属于哲学范畴了,理解不了。

echo "\n\n"
"是表象  \和n也是表象
你将三者组合在一起才在对shell说”给我echo两空行“

shell并不能懂"给我echo两空行"这个意思吧?
echo "\n\n" 经过shell解释为 echo '\n\n'(单引最后是没有的,只是表示的需要),执行echo 时将'\n\n'解释后两个换行符(默认情况需要 -e 选项, 即应该是 echo -e "\n\n")。

论坛徽章:
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
36 [报告]
发表于 2013-01-27 16:47 |只看该作者
注,我上面所说的"去掉引号"是指最后字符串,去掉只是某些引号,不是全部去掉。

在完成系列展开之后,不作为展开结果的所有非引用出现的字符这三个字符:\ ' ", 即不被引用的\ ' ", 都被移除。

详见 bash man。

b="b
b"
那么 echo aaa"${b}"aaa 经shell解释后的字符串是没有引号的。

而 echo aaa\"aaa 经shell解释的字符串为 aaa"aaa, 是有引号的。

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
37 [报告]
发表于 2013-01-27 17:11 |只看该作者
本帖最后由 关阴月飞 于 2013-01-27 17:36 编辑

{:3_191:}{:3_191:}{:3_191:}
神马是 " 表象 ",  各种深奥, 真心理解不了呀...........


测试了一下楼主,和黑哥的方法:
  1. [root@rhel63]# cat a
  2. a
  3. [root@rhel63]# b="b
  4. > b"
  5. [root@rhel63]# sed "s/a/$(echo $b)/" a
  6. b b
  7. [root@rhel63]# eval sed s/a/\"$b\"/ a      
  8. b b
复制代码
有个问题是: 这里两种方法都把 a 替换成了  b b ,  
如果要把它替换成二行呢? 即把a 替换成:
b
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
38 [报告]
发表于 2013-01-27 17:42 |只看该作者
回复 34# blackold
恩,我说不能用没有"表象的表象组合,来组成一条echo语句,使他输出
b
b
我武断了
echo -e b\\nb 就是证明

但是还是:  echo -e b\\nb 是 echo -e "b\nb"的等价表象,前者并不是后者的进一步直接
echo aaabaaa 才是 echo aaa"${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
39 [报告]
发表于 2013-01-27 18:17 |只看该作者
回复 38# cao627

对你的很多观点,无法说对还是错,因为无法理解你其中的一些概念。
   
但是还是:  echo -e b\\nb 是 echo -e "b\nb"的等价表象,前者并不是后者的进一步直接。


二者除了经shell解释的结果完全一样外,没有其它的隶属关系或者"进一步"的关系。

24楼:
A:
当b=b时
对shell来说
echo aaa${b}aaa 相同效果表象是 echo aaabaaa 对吗
还有比echo aaabaaa 更简单或同等简单但形状不同的相同效果表象吗?没有。可以说 echo aaabaaa 是 echo aaa${b}aaa的彻底直接


B:
当b="b
b"时
对shell来说
echo aaa${b}aaa 的等价表象是
echo "aaab
baaa"
还有同等简单的等价体
echo aaa"b
baaa" 等等。所以不是彻底直接


按照你的"表象"彻底直接"等说法,实际上对于b="b
b"时
echo aaa"${b}"aaa (这里应有双引号)的"等价表象"就是
echo aaab<字面的换行符>baaa
和 A 中的"表象"一样"彻底"。

论坛徽章:
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
40 [报告]
发表于 2013-01-27 19:23 |只看该作者
本帖最后由 blackold 于 2013-01-27 21:03 编辑

回复 37# 关阴月飞

try:
  1. sed "s/a/${b/\n'/\\n}/"
复制代码
被过滤了。

原命令是这样:
sed "s/a/${b/$'\n'/\\n}/"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP