我正在尝试使用sed删除文件的行,但我不想删除这些行,除非搜索字符串完全匹配。即
#!/bin/bash
set -x
file="list1"
index=0
while read line ;
do
if [ ! "$line" == "@@@" ];
then
MYARRAY[$index]="$line"
#index=$(($index+1))
let index++
else
break
fi
done < $file
#echo "MYARRAY is: ${MYARRAY[*]}"
#echo "The file: ${index}"
index1=0
for i in "${MYARRAY[@]}"
do
lineNumber=$((index1 + 1))
sed -i "/${MYARRAY[$index1]}/d" "$file"
let index1++
done
sed -i "/@@@/d" "$file"
#remove empty lines
sed -i '/^$/d' "$file"
所以我有一个测试文件(list1):
line1
line2
line3
line4
line5
line6
@@@
line1_1
line2_1
脚本运行后我最终删除了所有行,因为“line1”和line2“也匹配”line1_1“和”line2_1“
任何帮助都将不胜感激!!
答案 0 :(得分:1)
如果将sed模式匹配锚定到行的开头和结尾,那么它也不会匹配子串。像这样:
sed -i "/^${MYARRAY[$index1]}\$/d" "$file"
(转义'$'用于锚定到行尾,因为它是双引号字符串。)
编辑:那就是说,我觉得你可以用这个单线sed程序替换整个脚本:
sed '1,/@@@/d; /^$/d'
从文件的开头删除包含'@@@'的第一行,然后删除空白行,并在一次通过中完成所有操作。