加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 使用sed,shell或其他方法替换内联文本

发布时间:2020-12-15 21:09:29 所属栏目:安全 来源:网络整理
导读:我想将两个参数传递给程序,文件名和文件名的修改版本.情况是我在目录树中有一堆.html.erb文件,我希望用原始文件名和带有haml扩展名的新输出文件名调用html2haml,如下所示: html2haml thing.html.erb thing.html.haml 这是我目前最好的尝试: find . -name "
我想将两个参数传递给程序,文件名和文件名的修改版本.情况是我在目录树中有一堆.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,如果打印出如下内容:

06002

你有一个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

没有其他脚本或功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读