【问题标题】:use sed with for loop to delete lines from text file使用 sed 和 for 循环从文本文件中删除行
【发布时间】:2014-04-08 04:44:31
【问题描述】:

我实际上是在尝试使用 sed 删除文本文档中的几行。把它清理干净。但我一点也不明白。遗漏了一些东西,我不知道是什么......

#!/bin/bash

items[0]='X-Received:'
items[1]='Path:'
items[2]='NNTP-Posting-Date:'
items[3]='Organization:'
items[4]='MIME-Version:'
items[5]='References:'
items[6]='In-Reply-To:'
items[7]='Message-ID:'
items[8]='Lines:'
items[9]='X-Trace:'
items[10]='X-Complaints-To:'
items[11]='X-DMCA-Complaints-To:'
items[12]='X-Abuse-and-DMCA-Info:'
items[13]='X-Postfilter:'
items[14]='Bytes:'
items[15]='X-Original-Bytes:'
items[16]='Content-Type:'
items[17]='Content-Transfer-Encoding:'
items[18]='Xref:'

for f in "${items[@]}"; do
    sed '/${f}/d' "$1"
done

我在想的,似乎是错误的,我可以设置一个 for 循环来检查数组中我想从文本文件中删除的每个项目。但这根本行不通。任何想法。当然这是基本和简单的,但我无法弄清楚。

谢谢,

马雷克

【问题讨论】:

  • ${f} 不会在单引号中展开。你想要双引号。
  • 此外,您希望在循环中保存对文件的更改,否则您最终会得到相同的文件。对sed 使用-i 选项。
  • 你为什么不使用比 sed 更快的 grep -v -f YourSuppressList YourSourceFile (在你的情况下 fgrep 仍然更好)?

标签: bash for-loop sed


【解决方案1】:

最好创建一个sed 脚本,而不是依次生成19 个小脚本。

幸运的是,通过加入数组元素生成脚本是 Bash 中的moderately easy

regex=$(printf '\|%s' "${items[@]}")
regex=${regex#'\|'}

sed "/^$regex/d" "$1"

(还要注意在最终的正则表达式中添加了^——我假设您只想在行首匹配。)

您不应该从消息正文中删除任何行,因此脚本应该在第一个空行之后留下任何内容:

sed "1,/^\$/!b;/$regex/d" "$1"

如果您想就地编辑目标文件,请添加-i

【讨论】:

  • 在你的最后一行,sed "/^$regex/d" "$1" 它应该是:sed -i "/^$regex/d" "$1"。这很好用!谢谢!
  • 添加了仅涉及标题的版本。例如,这对于不破坏 MIME 多部分消息可能很重要。
猜你喜欢
  • 1970-01-01
  • 2016-06-19
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多