替换包含a的字符串。使用sed

时间:2016-06-15 01:42:54

标签: bash shell sed

我正在尝试复制文件夹中的所有.txt文件,但重命名为.html文件。

for f in my-txt-folder/*.txt
do
    a="$(echo $f | sed s/.txt/.html/)"
    cp "$f" "$a"
done

这是我的代码到目前为止,但是当我运行它时我得到了错误

my.html-folder/file.txt: No such file or directory.

我知道我收到此错误,因为它重命名了封闭文件夹中的“-txt”,但是如何阻止它呢?我也尝试将它替换为“\ .txt”但它仍然认为封闭文件夹名称是匹配的。如何使其仅匹配“.txt”?在有人要求之前,我不能只是钻进文件夹,然后从那里运行一个脚本。

2 个答案:

答案 0 :(得分:5)

您可以使用for构造来迭代文件名和参数扩展cp - ing:

for file in *.txt; do cp -i "$file" "${file%.*}".html; done

参数扩展模式${file%.*}获取文件名从末尾剥离.txt的文件部分。因此,对于文件名foobar.txt,我们会foobar,然后会.html添加foobar.html

示例:

$ ls *.txt
bar.txt  foo.txt

$ for file in *.txt; do cp -i "$file" "${file%.*}".html; done

$ ls *.{txt,html}
bar.html  bar.txt  foo.html  foo.txt

答案 1 :(得分:2)

在行尾匹配,例如

for f in my-txt-folder/*.txt
do
    a="$(echo $f | sed -e 's/\.txt$/.html/')"
    cp "$f" "$a"
done

以前的"。"您与sed匹配的是一个通配符,并且您没有将该模式锚定在行尾。

还有另一种来自heemayl的bash解决方案刚刚发布;全壳解决方案的优势在于您还不必学习sed的优点。