我正在尝试使用 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
?