Linux初学者 正则表达式询问

回复 收藏
如何使用sed命令将文件的第一个单词和最后一个单词调换位置。
这个是《跟阿铭学Linux》中的一道练习题,不太懂,哪位高人给指点一下。
2016-06-08 08:45 举报
已邀请:
0

星空的衣角

赞同来自:

sed -r 's#(^.)(.*)(.$)#\3\2\1#g' file
0

jackwolf

赞同来自:

星空的衣角 发表于 2016-6-8 09:45
sed -r 's#(^.)(.*)(.$)#\3\2\1#g' file

你好,谢谢。我还有一个不太懂得地方,这里没有用正则表达式判断哪个是单词,就可以调换吗?
0

星空的衣角

赞同来自:

jackwolf 发表于 2016-6-8 10:47
你好,谢谢。我还有一个不太懂得地方,这里没有用正则表达式判断哪个是单词,就可以调换吗?

.就表示任意一个字符了
0

maria

赞同来自:

星空的衣角 发表于 2016-6-8 09:45
sed -r 's#(^.)(.*)(.$)#\3\2\1#g' file

你这样只是首尾字母互换了,并没有达到他的要求:首尾单词互换

  1. sed -r 's#(^[[:alpha:]]*)([[:space:]])(.*)([[:space:]])(.*)#\5\2\3\4\1#g' file

试试这样?
0

jackwolf

赞同来自:

maria 发表于 2016-6-8 12:15
你这样只是首尾字母互换了,并没有达到他的要求:首尾单词互换

你好,是这样书后我看给了一个参考答案,但是我看不懂,答案是这样的  sed 's#\(^[a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\4\2\3\1#' file
我不明白的地方有:
不明白这中间为什么写了两次\([^a-zA-Z].*\)\([^a-zA-Z]\),这两个括号中都的意思都是非字母开头的类型,只是一个多了任意字符。
能帮忙解释一下吗?
0

maria

赞同来自:

jackwolf 发表于 2016-6-8 14:09
你好,是这样书后我看给了一个参考答案,但是我看不懂,答案是这样的  sed 's#\(^[a-zA-Z][a-zA-Z]*\)\([ ...

{:6_137:}其实这个和我那个差不多的。都是指明了单词之间的间隔
我的这个是用[[:space:]]表示的,你说的参考答案是用非字母表示的

简单举个例子
file里的字母为abc defg hij klmn opq rst uvw xyz
目的就是'abc'和'xyz'互换
我的语句是把'abc'看成一个整体,'defg hij klmn opq rst uvw'为一个整体,'xyz'看着一个整体,间隔用[[:space:]]表示,也就是空格
你说的参考答案是把'abc'看成一个整体,' defg hij klmn opq rst uvw'为一个整体,''为一个整体,'xyz'看着一个整体
所以他的\([^a-zA-Z].*\)表示的就是' defg hij klmn opq rst uvw',也就是abc后的一个空格一直到倒数第二个单词的内容
后面的\([^a-zA-Z]\)表示的就是' ',也就是最后一个单词之前的一个空格。
不知道这么解释你明白了没?
0

星空的衣角

赞同来自:

maria 发表于 2016-6-8 12:15
你这样只是首尾字母互换了,并没有达到他的要求:首尾单词互换

{:4_113:}的确,没看清题意
0

jackwolf

赞同来自:

maria 发表于 2016-6-8 15:03
其实这个和我那个差不多的。都是指明了单词之间的间隔
我的这个是用[[:space:]]表示的,你说的 ...

经过你这么一解释,我突然明白了,多谢多谢
{:4_95:}

回复帖子,请先登录注册

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