使用 sed 命令将与变量匹配的行替换为存储在变量文件中的新值

使用 sed 命令将与变量匹配的行替换为存储在变量文件中的新值

我正在尝试使用 sed 命令将模式匹配行(以“>”开头的行)替换为存储在变量中的新行,并对文件夹中的所有文件进行迭代。我想在新名称中间添加旧名称的一部分(仅字母和数字,如“ngs100”)。新名称必须以“>hC-19/Tb-”开头并以“/2022”结尾。这是我的脚本:


for file in $1/*.fa
do
    echo "Processing file: $file"
        OLD_NAME=$(grep ">" $file)
        echo "Old name is $OLD_NAME"
         NEW_NAME=$(grep ">" $file| cut -d_ -f3| cut -d- -f1 | awk '{X = ">hC-19/Tb-" $1 "/2022"} END {print X}')
        echo "New name is $NEW_NAME"
        sed -i 's, '"$OLD_NAME"','"$NEW_NAME"',' "$file"
        CHANGED_NAME=$(grep ">" $file)
        echo "Changed name is $CHANGED_NAME"
done

输出中的旧名称和新名称都是正确的。但所谓的“CHANGED_NAME”与旧名称相同,这意味着根本没有任何变化,也就是说sed -i没有起作用。我该如何让它起作用?

答案1

您很聪明,使用而不是典型的(它是 的一部分),作为命令的分隔符。但即使您确定该行内没有,任何其他字符(例如或 )都可能破坏脚本。s/$NEWNAME,\[

如果要/2022在以 开头的行末尾添加>,只需执行以下操作:

sed -i '/>/s,$, /2022,' "$file"
  • />/在命令之前表示“仅将该命令应用于包含以下内容的行>
  • 以下s命令将行尾 ( $) 替换为你的新结尾

这样,您的命令就不会因未知的文件内容而被破坏。

顺便说一句,如果您想将该字符串添加到旧行的末尾,为什么不简单地执行该操作,NEW_NAME="$OLD_NAME /2022"而是grep再次 ping 并通过管道传输到awk

相关内容