相关疑难解决方法(0)

从Grep RegEx捕获组

我在sh(Mac OSX 10.6)中有这个小脚本来查看一系列文件.谷歌此时已停止提供帮助:

files="*.jpg"
for f in $files
    do
        echo $f | grep -oEi '[0-9]+_([a-z]+)_[0-9a-z]*'
        name=$?
        echo $name
    done
Run Code Online (Sandbox Code Playgroud)

到目前为止(显然,对于你的shell大师)$name只有0,1或2,具体取决于是否grep发现文件名与提供的内容匹配.我想要的是捕获parens中的内容([a-z]+)并将其存储到变量中.

如果可能的话,我只想使用它grep.如果没有,请不要使用Python或Perl等,sed或类似的东西 - 我是shell的新手,并希望从*nix纯粹的角度来攻击它.

另外,作为一个超酷的bonu,我很好奇如何在shell中连接字符串?我捕获的组是$ name中存储的字符串"somename",我想在其末尾添加字符串".jpg",是cat $name '.jpg'吗?

如果你有时间,请解释一下发生了什么.

bash shell grep

355
推荐指数
7
解决办法
37万
查看次数

如何用sed替换包含斜杠的字符串?

我有一个Visual Studio项目,它是在本地开发的.必须将代码文件部署到远程服务器.唯一的问题是URLsthey包含硬编码.

项目包含URL,例如?page = one.要使链接在服务器上有效,它必须是/ page/one.

我决定在部署之前用sed替换我的代码文件中的所有URL,但是我坚持使用斜杠.

我知道这不是一个漂亮的解决方案,但它很简单会省去很多时间.我必须替换的字符串总数小于10.必须检查的文件总数约为30.

描述我的情况的示例如下:

我正在使用的命令:

sed -f replace.txt < a.txt > b.txt
Run Code Online (Sandbox Code Playgroud)

replace.txt包含所有字符串:

s/?page=one&/pageone/g
s/?page=two&/pagetwo/g
s/?page=three&/pagethree/g
Run Code Online (Sandbox Code Playgroud)

A.TXT:

?page=one&
?page=two&
?page=three&
Run Code Online (Sandbox Code Playgroud)

运行sed命令后b.txt的内容:

pageone
pagetwo
pagethree
Run Code Online (Sandbox Code Playgroud)

我希望b.txt包含:

/page/one
/page/two
/page/three
Run Code Online (Sandbox Code Playgroud)

sed

132
推荐指数
5
解决办法
16万
查看次数

有sed忽略不匹配的行

如何sed根据某个表达式创建过滤器匹配行,但忽略不匹配的行,而不是让它们打印?

作为一个真实的例子,我想scalac在一组文件上运行(Scala编译器),并从其-verbose输出中读取.class创建的文件.scalac -verbose输出一堆消息,但我们只对表单中的消息感兴趣[wrote some-class-name.class].我目前正在做的是这个(|&是bash 4.0将stderr传递给下一个程序的方法):

$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Run Code Online (Sandbox Code Playgroud)

这将从我们感兴趣的消息中提取文件名,但也会让所有其他消息保持不变!当然我们可以这样做:

$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
  sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Run Code Online (Sandbox Code Playgroud)

哪个有效,但看起来非常像绕过真正的问题,这是如何指示sed从输入中忽略不匹配的行.那我们该怎么做呢?

sed

82
推荐指数
2
解决办法
4万
查看次数

标签 统计

sed ×2

bash ×1

grep ×1

shell ×1