最近复习shell 中sed 发现个小问题

回复 收藏
问题  sed  命令中 同时出现 ^ 和$  LINUX 会以哪个为准;
比如  一个文件中  第一行  有4个/    第二行有 2个/   第三行有3个/  (如图)
那么我的这条命令    sed -r 's#(^.*)(.*/.*/)(.*$)#\3\2\1#g' test.txt   中 第二个表达式(.*/.*/)  指定了俩个/
那么 linux  会判断 我 最后 一个 式子  是 从前面的计算,(也就是 不包含我前俩个/的内容),
还是 从后往前 判断 认为 我第二个表达式的俩个/  是 针对任何行的最后俩个 /吗

这是问题的来源
把test.txt中第一个单词和最后一个单词调换位置   



sed -r 's#(^.*)(:.*:)(/.*$)#\3\2\1#g' test.txt

发现这样写的结果 不对
/bin/bash:/root:root:x:0:0:root           ------结果
root:x:0:0:root:/root:/bin/bash           --------源


铭哥的写法是:
sed -r 's#(^.*)(:x:.*)(/.*$)#\3\2\1#g'  test.txt
这样虽然可以  但是 只是针对 /etc/passwd 文件中  第二列的 "x" 相同, 如果按照我的 图片中的文件,这样写可能就不行了。


于是 我最后是使用了最笨的方法
sed -r 's#(^.*)(:.*:.*:.*:.*:.*:.*/.*/)(.*$)#\3\2\1#g' test.txt

               bash:x:0:0:root:/root:/bin/root  (最后一个单词与第一个调换)
sed -r 's#(^.*)(:.*:.*:.*:.*:.*:.*)(/.*/.*$)#\3\2\1#g' test.txt

               /bin/bash:x:0:0:root:/root:root  (最后的shell 与第一个单词调换)



但是 如果 每一行都特别长,,我想我这样写也不好,  请求大神给出 方法。。{:7_173:} 小弟谢过



sed 问题.png sed 问题.png
2015-02-25 16:57 举报
已邀请:
0

阿铭 管理员

赞同来自:

我想说的是,让自己轻松点吧!纠结这个干嘛呢?明白原理就好了!不管复杂与否能实现功能就好!大多时候我们要的是结果,不是过程。
0

wuhen

赞同来自:

你只要记住根据它的特点找规律,就行了不然就太累了
0

李昂

赞同来自:

- -好的。。。我是怕  工作之后碰到这种情况。。。。
0

ayu

赞同来自:

学习了
0

ayu

赞同来自:

学习中

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: