我有一个文件 .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”字样的值,它也会被删除。
所以,
谢谢
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 等。它们可用于单行程序或巨大的软件套件。
归档时间: |
|
查看次数: |
13184 次 |
最近记录: |