我在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'
吗?
如果你有时间,请解释一下发生了什么.
我有一个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
根据某个表达式创建过滤器匹配行,但忽略不匹配的行,而不是让它们打印?
作为一个真实的例子,我想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
从输入中忽略不匹配的行.那我们该怎么做呢?