【问题标题】:How can I delete all lines before a specific string from a number of files如何从多个文件中删除特定字符串之前的所有行
【发布时间】:2011-11-17 00:45:05
【问题描述】:

我有 n 个文件,例如:

文件1:

1aaa
2eee

Test        XXX
Hanna
Lars 

文件2:

1fff
2ddd
3zzz

Test        XXX
Mike
Charly

我想从所有 n 个文件中删除“Test XXX”之前的所有行。 要删除的行数因文件而异。

我的想法:

for file in 1 :n
do
pos=grep -n "Test XXX" file$file
sed -i "1:$pos-1 d" file$file >new$file
done

【问题讨论】:

标签: bash shell sed


【解决方案1】:

这应该适合你:

sed -i '1,/Test XXX/d' file1
sed -i '1,/Test XXX/d' file2

或者干脆

sed -i '1,/Test XXX/d' file*

【讨论】:

  • 小心这样做会丢失原始文件。
  • 这正是 -i(内联)选项的目的。
  • 如果您想同时创建备份文件,请使用-i.bak
  • sed '1,/Test XXX/d' newfile
  • 这似乎是在回答一个不同的问题;问题是如何删除特定行之前的行,不包括。
【解决方案2】:

这适用于您的示例,即使匹配的模式位于第一行:

sed -n -E -e '/Text XXX/,$ p' input.txt | sed '1 d'

例如,如果你输入简单

Test        XXX
Mike
Charly

这会给你

Mike
Charly

如果你想保留第一场比赛Test XXX,那么只需使用:

sed -n -E -e '/Text XXX/,$ p' input.txt

【讨论】:

  • 我发现一个 url 说 undocument -E (但它似乎是一个 ded 链接;感谢 Google,它有网络存储版本)。它与 -r 等效,它与 BSD 兼容(请参阅该死链接页面中的代码段:/* Undocumented, for compatibility with BSD sed. */ case 'E': case 'r': if (extended_regexp_flags) usage(4); extended_regexp_flags = REG_EXTENDED; break; . . .
  • 该链接有时可以,所以我将其网址发布在这里:blog.dmitryleskov.com/small-hacks/mysterious-gnu-sed-option-e
  • 来自手册 (man sed): -E, -r, --regexp-extended ; use extended regular expressions in the script (for portability use POSIX -E). 还有gnu.org/software/sed/manual/html_node/Extended-regexps.html
【解决方案3】:

你可以用bash 来做(例如1个文件)

t=0
while read -r line
do
    [[ $line =~ Test.*XXX ]] && t="1"
    case "$t" in
     1) echo "$line";;
    esac
done < file > tempo && mv tempo file

根据需要使用for 循环遍历所有文件

【讨论】:

    【解决方案4】:
    cat <<-EOF > file1.txt
    1aaa
    2eee
    
    Test        XXX
    Hanna
    Lars
    EOF
    
    cat file1.txt | sed -e '/Test *XXX/p' -e '0,/Test *XXX/d'
    

    输出:

    Test        XXX
    Hanna
    Lars
    

    解释:

    • -e '/Test *XXX/p' 复制匹配 /Test *XXX/ 的行
    • -e '0,/Test *XXX/d' 从第 0 行删除到匹配 /Test *XXX/ 的第一行

    通过复制行,然后删除第一行,我们有效地保留了匹配的行,成功删除了Test XXX之前的所有行

    注意:如果有多个 Test XXX 行,这将无法正常工作。

    【讨论】:

      猜你喜欢
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 2011-07-16
      • 2021-05-26
      • 1970-01-01
      • 2017-04-16
      相关资源
      最近更新 更多