【问题标题】:Deleting every line with a specific string in bash在bash中删除具有特定字符串的每一行
【发布时间】:2018-02-25 01:12:14
【问题描述】:

编辑: 我意识到我当前的代码是垃圾,但我之前尝试过的其他方法也没有奏效。问题是我在 Windows 上的 Notepad++ 中编辑了文件,并让它们在 Linux 上运行。程序 dos2unix 可以解决问题。

解决方案: 我在 Windows 中使用 Notepad++ 来编写导致问题的文件。通过 dos2unix 运行文件修复了它。

我编写了一个小 bash 脚本,它应该删除 $2 的每一行,其中包含一个在 $1 中指定的单词,并将输出写入 $3。但不知何故,它并没有按应有的方式工作。

#!/bin/bash

set -f          

while IFS='' read -r i || [[ -n "$i" ]]; do
   sed -i "/$i/d" "$2" 
done < "$1"

编辑:

示例

文件 1.test:

123
678
456

文件 2.test:

dasdas123dasd
3fsef344
678 3423423
r23r23rfsad
456 dasdasd

运行脚本:

./script.sh 1.test 2.test

输出应该是:

3fsef344
r23r23rfsad

但实际上是:

dasdas123dasd
3fsef344
678 3423423
r23r23rfsad

【问题讨论】:

  • 请澄清您所说的“不能正常工作”是什么意思。两个输入文件的示例,您获得的输出文件和您想要 获得的输出文件会很好。见"How to create a Minimal, Complete, and Verifiable example"。顺便说一句,您还应该通过shellcheck.net 运行您的代码并更正它找到的内容。
  • 我添加了一个示例并更改了我的代码,以便 shellcheck 不会检测到问题。
  • pluse-uno 用于提高你的 Q。祝你好运。

标签: bash sed cat


【解决方案1】:

您为什么要为此使用 shell 循环和 sed?

$ grep -vFf file1 file2
3fsef344
r23r23rfsad

如果这不能满足您的需要,那么请使用更具代表性的示例来澄清您的问题,因为“使用 shell 循环多次调用 sed”不是任何问题的答案。请参阅https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice 了解我这么说的一些原因。

【讨论】:

  • 我猜-F 也是个好主意? OP 说 file1 包含单词,而不是模式。
  • 可能,当然取决于 OP 的“单词”是什么意思,但我还是添加了它。感谢您的建议。
  • 我想不出更好的方法来做到这一点。你上面写的输出正是我想要的,但是当我执行命令时它也会输出 dasdas123dasd
  • 也许您在1.test 中有空格?检查并尝试先在您的文件上运行dos2unix,看看是否有帮助。
  • 谢谢!这就是问题所在!我认为在 notepad++ 中从 Windows 更改为 unix 会起作用,但它没有。
【解决方案2】:

每次调用sed 时,您都会重新加载$2 并覆盖$3。您应该对文件应用所有操作,而不是重新加载。

#!/bin/bash     
set -f          

cat "$2" > "$3"
while IFS='' read -r i || [[ -n "$i" ]]; do
   sed -i "/$i/d" "$3"
done < "$1"

【讨论】:

  • 也许改用cp "$2" "$3"? :)
猜你喜欢
  • 1970-01-01
  • 2011-08-21
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
相关资源
最近更新 更多