我想从bash中的某些字符串中提取版本号而不使用太多额外的包.到目前为止我试过了sed.
这是API:
3.81-8.1ubuntu1.1 should give : 3.81
2.68-1ubuntu2 should give : 2.68
1:1.11.3-1ubuntu2 should give : 1.11.3
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的sed命令:
echo ... | sed -r 's/.*([0-9\.]+).*/\1/'
Run Code Online (Sandbox Code Playgroud)
然而,开场.*太贪心,尤其是最后一个案例.我已经尝试了一些.*?,并.\{-}没有任何成功.
我可以两次通过,但我宁愿学习如何在一个中完成.
我似乎无法弄清楚如何为我的bash命令行提出正确的正则表达式.这就是我在做的事情:
echo "XML-Xerces-2.7.0-0.tar.gz" | sed -e's/^\(.*\)-[0-9].*/\1/g'
Run Code Online (Sandbox Code Playgroud)
这给了我......的输出
XML-Xerces-2.7.0
Run Code Online (Sandbox Code Playgroud)
...但我希望我需要输出...
XML-Xerces
Run Code Online (Sandbox Code Playgroud)
......我猜我能做到这一点......
echo "XML-Xerces-2.7.0-0.tar.gz" | sed -e's/^\(.*\)-[0-9].*/\1/g' | sed -e's/^\(.*\)-[0-9].*/\1/g'
Run Code Online (Sandbox Code Playgroud)
...但我想知道如何sed更好地理解正则表达式.
更新:
我试过这个......
echo "XML-Xerces-2.7.0-0.tar.gz" | sed -e's/^\([^-]*\)-[0-9].*/\1/g'
Run Code Online (Sandbox Code Playgroud)
......作为建议但是产出 XML-Xerces-2.7.0-0.tar.gz
如何删除锚标记,但将锚文本保留在Bash中?所以我想删除除示例文本之外的所有内容.
<a href="http://example.com">Example text</a>
Run Code Online (Sandbox Code Playgroud)
所以,如果我这样做:
echo '<a href="http://example.com">Example text</a>' | sed -e 's/<[^>]*>//g'
Run Code Online (Sandbox Code Playgroud)
这删除了所有的HTML.我想删除锚标签,但也保留锚文本...也就是这种情况下的示例文本.
我正在尝试使用Perl重新排序md5文件的内容.对于每一行,我想要没有路径的文件名然后是哈希.我提出的最好的命令是:
$ perl -pe 's|^([[:alnum:]]+).*?([^/]+)$|$2 $1|' DCIM.md5
Run Code Online (Sandbox Code Playgroud)
输入文件(DCIM.md5)由md5sumLinux生成.它看起来像这样:
e26ff03dc1bac80226e200c0c63d17a2 ./Path1/IMG_20150201_160548.jpg
01f92572e4c6f2ea42bd904497e4f939 ./Path 2/IMG_20150204_190528.jpg
afce027c977944188b4f97c5dd1bd101 ./Path3/Path 4/IMG_20151011_193008.jpg
Run Code Online (Sandbox Code Playgroud)
([[:alnum:]]+)的.*?.([^/]+).^(这里显然不必要)和$.没有$,表达式不会输出我所期望的.|而不是/作为分隔符来避免在文件路径中转义它.该命令返回:
IMG_20150201_160548.jpg
e26ff03dc1bac80226e200c0c63d17a2IMG_20150204_190528.jpg
01f92572e4c6f2ea42bd904497e4f939IMG_20151011_193008.jpg
afce027c977944188b4f97c5dd1bd101IMG_20151011_195133.jpg
Run Code Online (Sandbox Code Playgroud)
匹配是正确的,输出序列是正确的(文件名没有路径然后哈希)但间距不是:文件名后面有换行符.我希望它在哈希之后,像这样:
IMG_20150201_160548.jpg e26ff03dc1bac80226e200c0c63d17a2
IMG_20150204_190528.jpg 01f92572e4c6f2ea42bd904497e4f939
IMG_20151011_193008.jpg afce027c977944188b4f97c5dd1bd101
Run Code Online (Sandbox Code Playgroud)
在我看来,我的命令输出换行符,但我不知道如何改变这种行为.或者问题可能来自shell,而不是命令?
最后,一些版本信息:
$ perl -version
This is perl 5, version 22, subversion 1 (v5.22.1) built for i686-linux-gnu-thread-multi-64int
(with 69 registered patches, see perl -V for …Run Code Online (Sandbox Code Playgroud) 当我从在线RegEx测试工具上运行正则表达式模式时,以下文本可以正常工作。但是,在UNIX上使用sed时,它不起作用
文本:
<Field1><Field2><Field3>001</Field3></Field2><Field4><FieldDesc>Transaction Successful</FieldDesc></Field4><DtTm><LocalDtTm>2016-07-01-12:05:40.383</LocalDtTm></DtTm><Field5><Field6>N</Field6><Field7></Field7><DtTm><LocalDtTm>2016-07-01-12:05:44.171</LocalDtTm></DtTm></Field5></Field1>
Run Code Online (Sandbox Code Playgroud)
正则表达式:
<DtTm>(.*?)<\/DtTm>
Run Code Online (Sandbox Code Playgroud)
Sed中的用法:希望删除<DtTm>和之间的任何内容</DtTm>
sed 's/<DtTm>(.*?)<\/DtTm>//g'
Run Code Online (Sandbox Code Playgroud)
预期产量:
<Field1><Field2><Field3>001</Field3></Field2><Field4><FieldDesc>Transaction Successful</FieldDesc></Field4><Field5><Field6>N</Field6><Field7></Field7></Field5></Field1>
Run Code Online (Sandbox Code Playgroud) 我有一个文本没有空格的多行文件.
Thereisacat;whichisverycute.Thereisadog;whichisverycute.
Thereisacat;whichisverycute.Thereisadog;whichisverycute.
Run Code Online (Sandbox Code Playgroud)
我想提取猫和可爱之间的字符串(第一次出现不是第二次),即输出
;whichisvery
;whichisvery
Run Code Online (Sandbox Code Playgroud)
我接近得到它,但我最终得到了从猫到最后可爱的字符串从这里的命令.
sed -e 's/.*cat\(.*\)cute.*/\1/'
Run Code Online (Sandbox Code Playgroud)
我正进入(状态
;whichisverycute.Thereisadog;whichisvery
;whichisverycute.Thereisadog;whichisvery
Run Code Online (Sandbox Code Playgroud)
我如何从cat到第一次出现可爱的文字而不是最后?