如何使用 SED 函数删除给定单词的行

S7_*_*7_0 2 shell scripting

我有一个文件 .txt 里面

ID       VALUE
test     value_1
testing  value_2
first    value_3
second   value_4
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个 shell 脚本,它将删除与给定 ID 对应的行。例如,我想删除ID为“test”的行,所以我在论坛上发现可以通过以下方式使用“sed”功能:

sed -i '/test/d' file.txt
Run Code Online (Sandbox Code Playgroud)

但是,此函数也会删除 ID 为“testing”的行,因为该词与“test”一词复合。此外,该函数将检查每一行,因此如果存在带有“test”字样的值,它也会被删除。

所以,

  • 如何检查和删除 ID 列中仅包含“test”一词的每一行,因为 ID 位于每行的开头,我还可以问如何检查和删除以“test”一词开始的每一行?
  • 如何仅在 ID 为“test”而不与“test”一词复合时才能删除(在这种情况下,“testing”为 delete )
  • 功能“sed”真的够用了吗?

谢谢

typ*_*ast 10

使用\b\s^

\b匹配单词边界,并^匹配一行的开头:

sed -i '/^test\b/d' file.txt
Run Code Online (Sandbox Code Playgroud)

如果您的列以空格分隔\b,请考虑\s匹配空格字符而不是。

是否sed足够?

是的。


以下是对命令行文本处理中(大部分)其他“常见嫌疑人”的简要介绍:

或者,有时我grep用于类似目的,特别是如果我只想处理文件副本、重定向输出或将输出流式传输到另一个实用程序:

grep -v '^test\b' file.txt 
Run Code Online (Sandbox Code Playgroud)

或使用-w单词匹配:

grep -vw '^test' file.txt
Run Code Online (Sandbox Code Playgroud)

两个输出:

ID       VALUE
testing  value_2
first    value_3
second   value_4
Run Code Online (Sandbox Code Playgroud)

一旦您进入更高级别的脚本语言,还有许多其他更强大的选项可用。awk是一个很好的中间选择,并且擅长处理这样的表格输入:

awk 'NR > 1 && $1 != "test" { print $1,":",$2 }' test.txt
Run Code Online (Sandbox Code Playgroud)

NR > 1跳过第一行(标题),并$1 != "test"使用简单的字符串比较而不是正则表达式(尽管您可以等效地使用!/^test /)。该{ print ... }块打印出由冒号分隔的第一列和第二列(任意,只是为了向您展示一些可能的内容):

testing : value_2
first : value_3
second : value_4
Run Code Online (Sandbox Code Playgroud)

所以awk是一个很好的学习工具。之后,您将进入完整的编程语言领域,如 Perl、Python 等。它们可用于单行程序或巨大的软件套件。