我需要一个 Unix 命令,该命令将接受管道输入,过滤掉某些字符串,并将其余字符串写入标准输出。问题是,它需要是一个单行命令,不依赖于典型 Linux 发行版中未提供的任何东西。
上下文是“llvm-config --libs”链接到几个不应该的测试文件,我需要消除这些文件 - 但我需要在 configure.ac 中执行此操作。
不同之处在于,它不是每行一个项目,而是所有项目都在同一行,以空格而不是换行符分隔。
答案1
grep
是一个非常常见的 Unix/Linux 命令,至少我还没有遇到过任何需要专门安装基本命令grep
(egrep
而不是另一个过滤命令)的发行版。
采用管道输入,过滤掉某些字符串并将其余部分写入标准输出。
要这样使用它来过滤掉它,您可以执行以下操作(假设您正在使用cat
将文件打印到标准输出)
cat "some_file.txt" | grep -v "text to omit"
此外,grep
也适用于文件,因此上述命令可以这样写:
grep -v "text to omit" "some_file.txt"
该-v
标志告诉grep
打印所有内容除了指定的文本。如果您想要不区分大小写的搜索,则需要指定标志-i
。
不是每行一个项目,而是所有项目都在同一行,以空格而不是换行符分隔。
为此,您可以添加一个 for 循环来迭代单词,并仍然利用 grep 来实现您的需要,例如:
for word in "hello there how" are you how "am i today"; do echo $word; done | grep -v "how"
输出结果如下:
are
you
am i today
并且要将其输出到一行上,您可以使用tr
命令将 翻译\n
为空格:
for word in "hello there how" are you how "am i today"; do echo $word; done | grep -v how | tr '\n' ' '
其输出为:
are you am i today
第一部分for word in
是 shell 脚本for loop
。提供的链接特定于,BASH
但其他 shell 中的语法非常相似(至少对于CSH
、KSH
和ASH
),因此您可能需要进行调整以使语法与您的特定 shell 相匹配。
希望能够帮到你。