【问题标题】:Bash sed text replace with weird filenamesBash sed 文本替换为奇怪的文件名
【发布时间】:2021-03-21 10:17:02
【问题描述】:

我有一个目录中的文件列表,其中文件有空格和 ()

File1 (in parenthesis).txt
File 2 (in parenthesis).txt
File name 3.txt

每个文本文件的一行是

之间的文件名

文件1(括号内)

我需要修改它看起来像这样

TEST-File1(括号内)

但我似乎无法得到它...我可以打印文件名但是当我尝试执行 sed 命令以将整行替换为我想要的内容时...

for FILE in "$(find  . -type f -iname '*.txt')"
do
    sed -i "s/^<short_description> .*$/<short_description>TEST-$FILE<\/short_description>/" "$FILE"
done

...这个给我一个错误 “sed: -e 表达式 #1, char 54: `s'' 的未知选项” 我假设这意味着我没有逃脱什么,但老实说我不知道​​是什么。

有人可以帮忙吗?
谢谢!

【问题讨论】:

  • 我不能用给定的文件名重现这个;它们实际上是路径(包含/包含)吗?如果不是,它得到错误的具体文件名是什么?注意:将set -x 放在命令之前将使 bash 打印相当于正在执行的内容,这可能会让您更好地了解实际发生的情况。

标签: bash sed


【解决方案1】:

如果你说for FILE in "$(find . -type f -iname '*.txt')",所有文件名 find 的馈送用双引号括起来并合并成一个长的单个字符串 包含空格和换行符。

我可以把文件名打印出来

即使您尝试使用echo "$FILE" 进行调试,它也可能看起来像文件名 得到妥善处理。但事实并非如此。你可以用类似的东西看到它 echo "***${FILE}***".

那请你试试:

for file in *.txt
do
    sed -i "s#^\(<short_description>\)\(.*\)\(</short_description>\)#\1TEST-\2\3#" "$file"
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2013-04-30
    • 2014-02-09
    • 2022-10-21
    • 2018-05-24
    • 2020-04-24
    • 2020-07-20
    相关资源
    最近更新 更多