【问题标题】:search for string and echo only that line only?仅搜索字符串并仅回显该行?
【发布时间】:2012-03-17 12:20:06
【问题描述】:

是否可以搜索一个字符串,如果存在,只保留该行...完整的行,而不仅仅是字符串?我有两个逗号分隔的数据变量。我想做的是遍历我的 $data 变量并将它的 col2 用作搜索项。然后搜索 $example 变量,如果找到匹配项,则仅将一些数据添加到该行。在此下方将数据添加到正确的内容中,但它会打印两次,因为在这种情况下有两个项目。最好不要打印任何东西,除非它是匹配的,然后打印整行

#!/bin/bash
data="item,thing
item2,thing2"

example="a,lot,of,thing,in,this,csv
big,foot,lives,next,to,me,yikes"

echo "$data" | while IFS=, read -r col1 col2
do
echo "$example" | sed "s/$col1/$col2,$col1/i"                                                                            
done

我尝试将 col2 设为数组键,但没有成功。可能是因为我使用的是 Mac,并且根据我阅读的内容,它附带了旧版本的 Bash。

【问题讨论】:

  • 也许你想要一个像这样的 sed 脚本:"/$col1/s/^/$col2,/"
  • @VaughnCato - 我的 sed 脚本在上面工作,完全符合我的要求,它只是添加了比我想要的更多的数据。
  • 你的脚本是这样的,它会打印每一行,但是把搜索放在开头,它只会打印匹配的行。
  • @VaughnCato:一开​​始的模式没有任何赔率;您需要 -np(打印)命令才能有所作为。
  • @JonathanLeffler:没错,我猜我累了。

标签: bash unix sed awk grep


【解决方案1】:

如果您不希望 sed 打印,除非您要求,那么您可以写:

... | sed -n "/$col1/{s/$col1/$col2,$col1/i; p}"

我假设i 后缀对您的sed 方言有意义;这不是标准的。 -n 表示“不自动打印”。 /$col1/ 寻找模式;找到后,将执行大括号中的命令 - 您的替换操作,然后“打印该行”。

请注意,如果 $example 中出现 nitemare,则您的模式 item 将匹配。

【讨论】:

  • i 代表忽略大小写。是否可以将忽略大小写放在您正在寻找的东西上......所以在这种情况下sed -n "/$col1/IGNORE_CASE/{s/...
  • 不区分大小写的搜索修饰符,例如您的(假设的?)i,偶尔会很好,但 AFAIK,即使在 GNU sed 中也不可用。您必须使用 Perl(或 Python)才能获得该功能。请注意,有一个与 Perl 一起分发的 s2p 程序将 sed 脚本转换为 Perl 脚本。您可以在不使用修饰符的情况下使用它,然后编辑 Perl 脚本以添加它。
  • 谢谢乔纳森。我将字符串转换为大写,所以没有问题,它现在可以工作了。非常感谢。以前从不知道 -n 或 p 。有很多东西要学!
  • /REGEXP/I - “正则表达式匹配的 'I' 修饰符是一个 GNU 扩展,它导致 REGEXP 以不区分大小写的方式进行匹配。”它适用于选择器正则表达式以及答案中显示的替换。前者必须是大写的“I”,后者可以是任意一种。
  • @DennisWilliamson:要么我误读了我的手册(GNU sed 4.2,大约 2003 年;不是现代的),要么我没有提到它(可能太旧了)。谢谢提供信息。我对(现代)GNU 支持它并不感到惊讶。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多