【问题标题】:Parse each line with multiple string values in a file using shell script使用 shell 脚本在文件中使用多个字符串值解析每一行
【发布时间】:2022-01-14 06:58:38
【问题描述】:
    cat file.txt 
    
    "1" "USA" "abc"
    "2" "Canada" "pqr" 
....

我正在尝试将上述字符串值分配给一次遍历每一行的变量。 例如。 ->

sr="1" country="USA"    name="abc" 
sr="2" country="Canada" name="pqr"

关于如何实现这一目标的任何建议? 谢谢

【问题讨论】:

  • 多一点澄清你真正想要什么将不胜感激。您只想将所有值存储在数组中吗?你想遍历每个值吗?你到底想达到什么目的? - 你已经尝试过的例子也很棒。
  • 感谢您的留言!我在上面添加了一个示例来解释我想要实现的目标。
  • while read -r sr country name ; do … ; done < file.txt?
  • 创建此文件格式的人应该准备好接受对其身体完整性的严重威胁,也许来自您。
  • 大概差不多,sed 's/^"//;s/"$//;s/" "/\t/g' file.txt | while IFS=$'\t' read -r sr country name; do... 演示:ideone.com/bo8iIo

标签: bash shell sh


【解决方案1】:

试试这个:

cat 1.txt|awk '{print "str="$1,"country="$2,"name="$3}'

【讨论】:

    【解决方案2】:

    如果引用的数据符合Double Quotes的Bash规则,则可以使用set

    #! /bin/bash
    
    exec <<EOF
    "1" "USA" "abc"
    "2" "Canada" "pqr" 
    EOF
    
    while read -r line; do
      source <(printf 'set %s\n' "$line")
      printf 'sr="%s" country="%s" name="%s"\n' "$@"
    done
    

    如果引用的数据与JSON quoting rules兼容,可以使用jq解析数据:

    #! /bin/bash
    
    exec <<EOF
    "1" "USA" "abc"
    "2" "Canada" "pqr" 
    EOF
    
    jq -sr '.[]' | while true; do
      read -r sr || break
      read -r country
      read -r name
      printf 'sr="%s" country="%s" name="%s"\n' \
             "$sr" "$country" "$name"
    done
    

    这将不太容易受到安全漏洞的影响。

    【讨论】:

    • 你在自找麻烦:-P
    • @Fravadona ideas of other people 也好不了多少。 Bash 不是编写解析器的正确工具。您可以通过jq 啜饮数据,感觉好一点。但由于他没有说明引用规则:这至少对问题中的两行有效。
    • source &lt;(printf 'set %s\n' "$line") 与使用eval 没有什么不同,除了使用子shell 和进程替换。
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2023-03-14
    相关资源
    最近更新 更多