我有一个文件test.txt
,其中包含以下结果:
service_name1= apple/ball/cat/dog/egg/12.34.56/ball/apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl
等等直到service_name1500
我想要像这样的输出:
egg 12.34.56
joker 23.45.67
等等:版本号以及其前的单词。
答案1
这应该是一项简单的cut
工作:
cut -d/ -f5,6 --output-delimiter=" "
-d/
将输入分隔符设置为/
-f5,6
仅输出第 5 和第 6 个字段--output-delimiter=" "
将输出分隔符设置为空格
与 相同awk
,awk
默认情况下将输出字段分隔符设置为空格:
awk -F/ '{print $5,$6}'
例子:
% cat file.txt
service_name1= apple/ball/cat/dog/egg/12.34.56/ball/apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl
% cut -d/ -f5,6 --output-delimiter=" " file.txt
egg 12.34.56
joker 23.45.67
% awk -F/ '{print $5,$6}' file.txt
egg 12.34.56
joker 23.45.67
答案2
一种sed
解决方案(无论版本字符串的字段位置是否一致都可以,但版本字符串的形式必须一致)
$ sed -r 's#.*/(.*)/([0-9]{2}\.[0-9]{2}\.[0-9]{2}).*#\1 \2#' test.txt
egg 12.34.56
joker 23.45.67
解释
-r
使用 ERE,这样我们就不必转义()
元字符s#old#new#
找到模式old
并替换为new
.*
匹配此位置上的任意字符或者不匹配任何字符(stuff)
记住stuff
[0-9]{2}\.[0-9]{2}\.[0-9]{2}
[2 位数字].[2 位数字].[2 位数字] 的模式\1 \2
两个记住的模式之间有一个空格
答案3
这将做到这一点:
cut -d'/' -f5-6 test.txt | tr -s "/" " "
答案4
$sed -r 's/.*\/([[:alpha:]]+)\/([\.0-9]*)\/.*/\1 \2/' test.txt
解释:
.*
在开头和结尾处剪切所有不匹配以下内容的字符([[:alpha:]]+)
括号中的第一个子组仅匹配字母字符\/
匹配将被剪掉的斜线- 下一个子组
([\.0-9]*)
匹配数字和点并将其存储在第二个寄存器中 - 单斜线后面
/
是替换,\1 \2
插入匹配子组中的第一个和第二个寄存器