gpt4 book ai didi

bash - 使用 sed、shell 或其他方式进行内联文本替换

转载 作者:行者123 更新时间:2023-11-29 09:12:09 25 4
gpt4 key购买 nike

我想向一个程序传递两个参数,一个文件名和一个文件名的修改版本。情况是我在目录树中有一堆 .html.erb 文件,我想使用原始文件名和带有 haml 扩展名的新输出文件名对它们调用 html2haml,如下所示:

html2haml thing.html.erb thing.html.haml

这是我目前对此的最佳尝试:

find . -name "*.html.erb" -exec echo {} `echo {} | sed "s/.erb/.haml/g"` \;

(完成测试后,我会将 echo 替换为 html2haml 并再次运行)

但是它不起作用。反引号内表达式的结果是未修改的字符串。

以下是我尝试过的一些实验,它们的行为符合预期(以测试我的语法和转义/引号级别是否正确):

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 {}` \;

所有这些都按预期运行的事实向我表明我在语法中犯了一些小错误,这确实可以用一行代码来完成。

如果这是不可能的,可能是因为对 find 在每次调用时“何时”插入其结果的误解。上面的示例 #3 向我表明,它恰好在我需要/期望它时执行(因为我成功地将每个单独的结果字符串与“hello”连接起来)。

最佳答案

如果你有gsed:

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,如果输出类似:

sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.

你有一个 GNU sed。

上面 - 为下一个 find

$ 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

没有额外的脚本或函数。 ;)

或者您可以将 sed 替换为 perl,所以接下来

find . -name \*foo -print0 | perl  -n0le 'print;s/foo/foo2/;print' | 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

如果您真的想在一次查找中完成,请尝试:

find . -name \*html.erb -exec sh -c 'echo html2haml "{}" "$(echo "{}" | sed 's/\.erb/\.haml/')"' \;

或者去掉两个无用的回显最后的命令:

find . -name \*html.erb -exec sh -c 'html2haml "{}" "$(sed 's/\.erb/\.haml/'<<<"{}")"' \;

关于bash - 使用 sed、shell 或其他方式进行内联文本替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17576814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com