AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 454912
Accepted
Spike
Spike
Asked: 2018-07-13 06:11:08 +0800 CST2018-07-13 06:11:08 +0800 CST 2018-07-13 06:11:08 +0800 CST

如何根据有空格的分隔符剪切字符串

  • 772
variable_list="
 any:any:-a -b -c any
 one:one:-c -b -f -m mul
 mul:one:-c -b -f -m mul
"
for f in `echo $variable_list`
do
  c1=`echo $f | cut -d':' -f1`;
  c2=`echo $f | cut -d':' -f2`;
  c3=`echo $f | cut -d':' -f3-`;
  echo "c1==>$c1 and c2==>$c2 and c3==>$c3";
  #exit 0; ###I made mistake here
done;

预期输出:

c1==>any and c2==>any and c3==>-a -b -c any
c1==>one and c2==>one and c3==>-c -b -f -m mul
c1==>mul and c2==>one and c3==>-c -b -f -m mul

编辑1:

我意识到我在使用脚本时很愚蠢,并且在第一次迭代时我exit 0只测试第一行,因为我有很多真实的。它按照它必须的方式工作。

我可以通过维护variable_list而不修改输入的格式/方式来实现上述输出吗?

(我正在使用 bash)

cut
  • 2 2 个回答
  • 2150 Views

2 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2018-07-13T06:49:01+08:002018-07-13T06:49:01+08:00

    您的问题与数据中的空格有关。shell 会将字符串拆分为所有空格上的单词,并且for循环将遍历这些单词。

    (对于不替换variable_list为数组的解决方案,请参阅此答案的最后。)

    相反,使用适当的数组:

    variable_list=(
        "any:any:-a -b -c any"
        "one:one:-c -b -f -m mul"
        "mul:one:-c -b -f -m mul"
    )
    
    for var in "${variable_list[@]}"; do
        c1=$( cut -d':' -f1  <<<"$var" )
        c2=$( cut -d':' -f2  <<<"$var" )
        c3=$( cut -d':' -f3- <<<"$var" )
        printf 'c1==>%s and c2==>%s and c3==>%s\n' "$c1" "$c2" "$c3"
    done
    

    使用数组可确保您可以将每个单独的变量集作为其自己的数组条目来访问,而无需依赖换行符或其他字符分隔它们。

    该代码还使用“here-strings”bash将字符串发送到cut(而不是echo管道)。

    或者,更有效地,

    variable_list=(
        "any:any:-a -b -c any"
        "one:one:-c -b -f -m mul"
        "mul:one:-c -b -f -m mul"
    )
    
    for var in "${variable_list[@]}"; do
        IFS=':' read -r c1 c2 c3 <<<"$var"
        printf 'c1==>%s and c2==>%s and c3==>%s\n' "$c1" "$c2" "$c3"
    done
    

    设置IFS为冒号read会read在冒号(而不是空格、制表符和换行符)上拆分输入。

    请注意,上面的所有引用都很重要。如果没有双引号,shell 将对 的值和三个变量执行分词和文件名variable_list通var配c。

    有关的:

    • 什么时候需要双引号?
    • 为什么 printf 比 echo 好?
    • *sh shell 中的反引号(即 `cmd`)是否已被弃用?

    如果您所追求的只是那个特定的输出,那么您可能会作弊:

    variable_list=(
        "any:any:-a -b -c any"
        "one:one:-c -b -f -m mul"
        "mul:one:-c -b -f -m mul"
    )
    
    ( IFS=':'; set -f; printf 'c1==>%s and c2==>%s and c3==>%s\n' ${variable_list[@]} )
    

    这会printf在子 shell 中运行,因此设置IFS和-f( noglob) shell 选项不会影响脚本的其余部分。在此处设置IFS为冒号将使 shell 将不带引号 variable_list的数组扩展为三组三个参数printf。 printf将根据其格式字符串打印前三个,然后为下一组三个参数重用该格式,直到所有参数都已处理。

    如果其中有任何文件名通配符,则可以set -f防止未引用的扩展触发文件名通配符。variable_list


    使用换行符分隔的字符串:

    variable_list="
    any:any:-a -b -c any
    one:one:-c -b -f -m mul
    mul:one:-c -b -f -m mul"
    
    while IFS= read -r var; do
        IFS=':' read -r c1 c2 c3 <<<"$var"
        printf 'c1==>%s and c2==>%s and c3==>%s\n' "$c1" "$c2" "$c3"
    done <<<"$variable_list"
    

    这从字符串中读取数据,就好像它来自文件一样。

    有关的:

    • 理解“IFS=read -r line”
    • 5
  2. ctac_
    2018-07-13T10:29:08+08:002018-07-13T10:29:08+08:00

    您可以使用 awk 获取输出:

    echo "$variable_list" | awk -F: '
    {
      sub("^ ","")
      for(i=1;i<=NF;i++)
        sub(/^/,"c" i "==>",$i)
    }1' OFS=" and "
    
    • 0

相关问题

  • 使用“-exec”和查找时“没有这样的文件或目录”

  • 剪掉前两行

  • 从文件列表中剪切和替换特定列

  • sort 查找特定列中有多少不同的值

  • 是否有“| cut -f1,2,3 -d:”的参数替换/扩展替代方案,也就是在出现第 n 个字符之后并包括修剪?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve