【问题标题】:How can I tell bash to properly escape expanded strings?如何告诉 bash 正确转义扩展字符串?
【发布时间】:2010-02-05 11:51:51
【问题描述】:

假设我有一个包含文件的目录

foo bar.txt  
foo baz.txt

(每个在 'o' 和 'b' 之间都有一个空格)。假设我想这样做:

for f in *.txt; do mv ${f} `basename ${f} .txt`; done

这失败了,因为 bash 将 *.txt 扩展为

foo bar.txt foo baz.txt

而不是

foo\ bar.txt foo\ baz.txt

即就好像我使用了制表符完成一样正确转义。

如何让 bash 正确转义其输出?

【问题讨论】:

    标签: bash escaping


    【解决方案1】:

    您在变量中加上引号。这样你就可以保留空间。此外,无需使用外部命令basename。 shell 可以为你做到这一点。 (假设您使用的是 bash)

    for file in *.txt
    do
     mv "$file" "${file%.txt}"
    done
    

    【讨论】:

    • ..添加了缺少的终止引号
    • 谢谢。当你添加它时,我也在这样做。
    【解决方案2】:

    或者,如果是一次性操作,您可以使用 vim:

    > ls -al
    foo bar.txt
    foo baz.txt
    

    打开vim并执行:

    :r!ls *.txt
    

    这会加载文件,然后执行:

    :%s/\(\(.*\)\.txt\)/mv "\1" "\2"/gc
    

    这会将这些行替换为:

    mv "foo bar.txt" "foo bar"
    mv "foo baz.txt" "foo baz"
    

    Ctrl-v 向下突出显示所有内容,然后输入: 并输入此命令的其余部分:

    :'<,'>!bash
    

    这将在 bash 中执行突出显示的命令。退出 vim 并检查你的目录:

    > ls
    foo bar
    foo baz
    

    【讨论】:

    • vim 中输入::!for f in *.txt; do mv "${f}" "${f%.txt}"; done(假设 Bash 是你的 shell)。
    猜你喜欢
    • 2011-03-18
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2011-10-30
    • 2011-01-05
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多