bash – 使用sed,shell或其他方法替换内联文本
我想将两个参数传递给程序,文件名和文件名的修改版本.情况是我在目录树中有一堆.html.erb文件,我希望用原始文件名和带有haml扩展名的新输出文件名调用html2haml,如下所示:
html2haml thing.html.erb thing.html.haml 这是我目前最好的尝试: find . -name "*.html.erb" -exec echo {} `echo {} | sed "s/.erb/.haml/g"` ; (在我完成测试之后,我将用html2haml替换echo并再次运行它) 但它不起作用.反引号内表达式的结果是未修改的字符串. 以下是我尝试过的一些实验,其中DO的行为符合预期(测试我的语法和转义/引用的级别是否正确): 1. echo myfile.foo | sed 's/foo/foo2/g' 2. find . -name "*.html.erb" -exec echo {} `echo xyz | sed "s/y/Y/g"` ; 3. find . -name "*.html.erb" -exec echo {} `echo {} hello` ; 4. find . -name "*.html.erb" -exec echo {} `echo {}` ; 这些都表现得如预期的事实告诉我,我在语法中得到了一些小错误,这确实可以用一个单行程来做到这一点. 如果这是不可能的,可能是因为对“何时”查找在每次调用时插入其结果的误解.上面的示例#3向我建议,当我需要/期望它时它完全正确(因为我成功地将每个单独的结果字符串与“hello”连接). 解决方法
如果您已经过了:
find . -name *.erb -print0 | gsed -z 'p;s/.erb$/.haml/' | xargs -0 -n2 html2haml 如果你没有gsed并且只有sed,这将有效,但前提是你的文件名都没有空格. find . -name *.erb -print | sed 'p;s/.erb$/.haml/' | xargs -n2 html2haml 关于这些和其他技术的讨论如下: 我有不同版本的sed – 我的GNU sed被称为gsed,如果你的sed是GNU – 而不是gsed使用sed. 您可以使用sed –version检查您的sed,如果打印出如下内容:
你有一个GNU sed. 以上 – 为下一个发现 $find . -name *foo -print ./a/test.foo ./b/c/test.foo ./b/te st.foo #<- note the filename with space ./b/test.foo 上面的命令产生: $find . -name *foo -print0 | gsed -z 'p;s/foo$/foo2/' | xargs -0 -n2 echo bar bar ./a/test.foo ./a/test.foo2 bar ./b/c/test.foo ./b/c/test.foo2 bar ./b/te st.foo ./b/te st.foo2 bar ./b/test.foo ./b/test.foo2 没有其他脚本或功能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |