相关疑难解决方法(0)

.*sed太贪心了

我想从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)

然而,开场.*太贪心,尤其是最后一个案例.我已经尝试了一些.*?,并.\{-}没有任何成功.

我可以两次通过,但我宁愿学习如何在一个中完成.

regex grep sed

3
推荐指数
1
解决办法
421
查看次数

如何让sed做非贪婪的比赛?

我似乎无法弄清楚如何为我的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

regex bash sed

3
推荐指数
1
解决办法
2万
查看次数

删除锚标记,但保留锚文本

如何删除锚标记,但将锚文本保留在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.我想删除锚标签,但也保留锚文本...也就是这种情况下的示例文本.

unix bash sed

2
推荐指数
1
解决办法
2436
查看次数

s ///返回不合适的换行符

我正在尝试使用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)
  1. 散列是由第一组匹配([[:alnum:]]+)
    正则表达式.
  2. 然后空格和文件的路径
    匹配.*?.
  3. 然后文件名匹配([^/]+).
  4. 表达式附有^(这里显然不必要)和$.没有$,表达式不会输出我所期望的.
  5. 我使用|而不是/作为分隔符来避免在文件路径中转义它.

该命令返回:

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 perl newline

2
推荐指数
1
解决办法
102
查看次数

SED-非贪婪的正则表达式似乎无法在sed中工作

当我从在线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)

regex bash sed

1
推荐指数
1
解决办法
902
查看次数

如何使用sed或awk在开始子字符串和结束子字符串的基础上提取行部分

我有一个文本没有空格的多行文件.

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到第一次出现可爱的文字而不是最后?

linux awk sed data-analysis

1
推荐指数
1
解决办法
651
查看次数

标签 统计

sed ×5

regex ×4

bash ×3

awk ×1

data-analysis ×1

grep ×1

linux ×1

newline ×1

perl ×1

unix ×1