【问题标题】:Delete specific line with sed without deleting other lines with same prefix使用 sed 删除特定行而不删除具有相同前缀的其他行
【发布时间】:2012-10-21 18:37:53
【问题描述】:

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

任何帮助将不胜感激!

【问题讨论】:

    标签: bash shell sed


    【解决方案1】:

    如果您将 sed 模式匹配锚定到行的开头和结尾,那么它也不会匹配子字符串。像这样:

    sed -i "/^${MYARRAY[$index1]}\$/d" "$file"
    

    (转义用于锚定到行尾的“$”,因为它位于双引号字符串中。)


    编辑:也就是说,在我看来,您可以用这个单行 sed 程序替换整个脚本:

    sed '1,/@@@/d; /^$/d'
    

    从文件开头删除到包含“@@@”的第一行,然后还删除空白行,并且一次完成。

    【讨论】:

    • 酷 - 谢谢。这只是一个测试脚本,我需要进行行操作,然后仅当这些操作成功时才​​从提要文件中删除该行。我不知道该怎么做,但目的是在文本文件@@@ 中放置一个标记,然后在文件中构建一个直到该行的数组,执行操作,然后删除每一行和@@@ 标记。然后,该脚本将在同时添加到文件中的任何内容上再次运行。
    • @ilium007:啊,现在这完全是一个不同的问题! :-) 开始处理文件时考虑将文件重命名为临时名称,让写入它的任何内容创建一个新的空文件,并在完成读取后删除临时文件。仍有竞争条件需要考虑,但这应该更接近可靠的解决方案。
    • 酷,谢谢@jamey-sharp。现在阅读比赛条件:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2017-10-13
    • 1970-01-01
    • 2020-08-13
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多