【问题标题】:Search part of a string in a file在文件中搜索部分字符串
【发布时间】:2014-01-21 17:59:03
【问题描述】:

假设我有一个变量 $str1

str1="20140121-21:48:26|Joanne Frances|"

我想做的是在文件中搜索该部分。该文件包含,例如:

20140121-21:48:26|Joanne Frances|Perez|9173046751.000000|Mar 31|
20140121-21:50:28|Nikko|Real|9065887272.000000|Mar 21|
20140121-22:22:53|Czarina|Revilla|9999999999.000000|Jan 21|

输出应该是:

20140121-21:48:26|Joanne Frances|Perez|9173046751.000000|Mar 31|

我不知道这是否重要,但这是我使用 yad 的实际代码 sn-p:

selected=$(yad --title=Contacts --width=200 --height=200 \
               --button=DISPLAY:2 --list \
               --separator="|" --column=ID:NUM --column=List \
               "${items[@]}" --hide-column=1 --button=ADD:10 )
req=$?

#BUTTON HANDLER:
if [ $req = 10 ]; then
    formdata=$(yad --title="Add Contact"   \
    --form --field="FIRST NAME" --separator="|"   \
     --field="LAST NAME"   \
     --field="CONTACT #:NUM"   \
     --field="Birthday (Mon Day):DT"  --date-format="%b %d" \
     "" "" "!09000000000..09999999999!11."
    )

        echo "$contactid|$formdata" >> contactlist.txt

elif [ $req = 2 ]; then
    grep "$selected" contactlist.txt #This is my problem

fi

它不输出任何东西

更新: 终于知道echo $selected 尝试的问题到底是什么,它输出20140121|Adrian Perez| 意味着它真的不在文件中。哈哈!我真是一团糟! -_-

【问题讨论】:

  • 你考虑过grep "$str1" file 吗?
  • 不确定我要做什么,但我尝试了grep "$selected" contactlist.txt,但它不起作用! @cnicutar
  • @joanne_ 为什么在搜索字符串是 $str1 时使用 $selected?
  • @Trenin 哇!对不起这是我的错!这是我在代码中使用的变量,上面的代码只是一个例子!
  • @joanne_:请参阅 cnicutar 的评论。你试过 grep 吗?

标签: string bash shell search scripting


【解决方案1】:

你熟悉grep吗?它是专为此类目的而设计的工具,而且功能非常强大。

给大家简单介绍一下最基本的用法:grep <pattern> <file>(如果你坚持使用管道,也可以cat <file> | grep <pattern>)。在您的示例中,这将是 grep "20140121-21:48:26|Joanne Frances|" foo 假设 foo 是文件的名称。这会产生你想要的——包含模式的一行。

【讨论】:

  • 是的,有效..但这实际上不是我想要的。 :( 我希望能够使用变量$str1 以便我可以更改值
  • 您打算在脚本中还是在交互式 shell 中使用它?如果是后者,那么您可以执行export str1="20140121-21:48:26|Joanne Frances|" 然后调用grep "$str1" foo 以获得与上述相同的效果。你可以在脚本中做同样的事情,除了不需要使用export,你可以声明str1="20140121-21:48:26|Joanne Frances|",你很高兴:)
  • 感谢@Erathiel 的帮助! :) 我发现变量本身有问题,这就是它没有输出任何东西的原因。哈哈愚蠢的我!
  • 出于测试/调试目的,您只需在grep "$selected" contactlist.txt 之后的行中添加echo $?。 bash 中的变量$? 存储了最后一条命令的退出代码。如果是0,那么一切正常(例如,找到了搜索模式),如果它不为零,则意味着没有找到任何东西或发生了一些错误。这将帮助您了解正在发生的事情:)
  • 感谢您的帮助!我实际上在使用 yad 作为界面,它只是让一切变得复杂哈哈!如果您还没有看到我的更新,请查看上面的更新
【解决方案2】:

使用 grep

这里的使用细节:http://unixhelp.ed.ac.uk/CGI/man-cgi?grep 或检查手册页 run> man grep 从 shell

假设您的数据位于名为 test_file.txt 的文件中的示例

grep "20140121-21:48:26|Joanne Frances|" test_file.txt

【讨论】:

    【解决方案3】:

    为我工作:

    $ cat contactlist.txt 
    20140121-21:48:26|Joanne Frances|Perez|9173046751.000000|Mar 31|
    20140121-21:50:28|Nikko|Real|9065887272.000000|Mar 21|
    20140121-22:22:53|Czarina|Revilla|9999999999.000000|Jan 21|
    $ echo $str1
    20140121-21:48:26|Joanne Frances|
    $ grep "$str1" contactlist.txt 
    20140121-21:48:26|Joanne Frances|Perez|9173046751.000000|Mar 31|
    $ 
    

    【讨论】:

      猜你喜欢
      • 2022-10-15
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 2021-06-28
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多