如何在 Bash 中拆分带引号的字符串?

2023-12-26

很少有问题 https://stackoverflow.com/questions/918886/how-do-i-split-a-string-on-a-delimiter-in-bash关于如何通过给定分隔符拆分 Bash 脚本中的字符串有很好的答案。

我的问题是我得到了一个包含空格分隔字符串的文件,其中may被引用,例如

foo bar "foo bar baz" baz

我想要这 4 个值foo, bar, foo bar baz and baz.

如何通过尊重引号将这些输入拆分为 Bash 数组?


The bashshell默认不提供多字符IFS支持分隔,但由于它是我们正在处理的文件,因此我们可以使用GNU Awk它支持 FPAT 来定义如何处理我们正在处理的每个单词。

从 GNU Awk 手册页中按内容定义字段 https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html

通常情况下,使用时FS, gawk将字段定义为出现在每个字段分隔符之间的记录部分。换句话说,FS定义字段不是什么,而不是字段是什么。然而,有时您确实想根据字段是什么来定义字段,而不是根据字段不是什么来定义字段。

后一部分就是我们需要使用的时候FPAT,为了满足您对空格分隔的字符串和双引号内的字符串的要求,我们定义了一个模式,如下所示,表示任何不是包含双引号内的空格(或)但不是双引号的内容。

FPAT = "([^[:space:]]+)|("[^"]+")"

但要将其作为字符串写入Awk,你需要转义上面的双引号,

awk 'BEGIN{FPAT = "([^[:space:]]+)|(\"[^\"]+\")"}{for(i=1;i<=NF;i++) print $i}' myFile

这将在单独的行中打印您输入的每个单词,如下所示,

foo
bar
"foo bar baz"
baz

从这里开始,存储在bash上下文你所需要的只是过程替换和mapfile命令,

mapfile -t newArray < <(awk 'BEGIN{FPAT = "([^[:space:]]+)|(\"[^\"]+\")"}{for(i=1;i<=NF;i++) print $i}' myFile)

然后你可以将数组打印为

declare -p newArray 

(或)明确打印它

for item in "${newArray[@]}"; do
    printf '%s\n' "$item"
done
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Bash 中拆分带引号的字符串? 的相关文章

  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • Git difftool 未启动外部 DiffMerge 程序

    我一直遵循 戴夫的博客条目 http www davesquared net 2009 05 setting up git difftool on windows html 链接在此answer https stackoverflow co
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • 使用 su 和 Expect 脚本登录用户时遇到问题

    我正在为一个班级制作一个网站 您可以使用用户名和密码登录 然后它会将您带到一个显示您在班级中的成绩的页面 该网站正在运行bash脚本 https github com jduga002 rapache 并将托管在用户已有用户名和密码登录的计
  • 对重复的名称添加双引号

    我想从文件中找到重复的名称 如下所示 并用 标记它们 file James Miki 123 456 7890 Wang Tai 234 563 6879 James Miki 123 456 7890 输出希望看起来像 James Mik
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • Bash 脚本:自动为 mpeg-dash 进行 ffmpeg 编码

    我正在编写一个 bash 文件来创建视频编码和串联 以供 dash 实时流媒体使用 基本上 它读取输入视频文件夹 将所有视频编码为三种分辨率格式 然后将它们连接起来创建三个适应集 DIAGRAM 该脚本检查 fps 一致性 如果输入不是 1
  • 通过 sed 使用 unix 变量将数据附加到每行末尾[重复]

    这个问题在这里已经有答案了 我有一个文件 我想使用 SED 将值附加到每行末尾的 unix 变量中 我已经通过 AWK 实现了这一点 但我想在 SED 中实现 像这样的东西 我已经尝试过以下命令 但它不起作用 sed i s BATCH R
  • 将 stdout 和 stderr 重定向到带有前缀的单个文件

    我正在编写一个 bash 脚本 需要重定向stdout and stderr我运行到单个文件的命令的输出 在每行前面加上前缀stderr or stdout 因此 有没有一个简单的方法可以做到这一点 from Debian http www
  • 如何在 bash 上运行 MySQL 命令?

    以下代码在命令行上运行 mysql user myusername password mypassword database mydatabase execute DROP DATABASE myusername CREATE DATABA
  • 如何在 OS X 上查看 $PATH 变量的当前值?

    PATH returns bash usr local share npm bin Library Frameworks Python framework Versions 2 7 bin usr local bin usr local s
  • 用等号完成命令选项

    我正在尝试为可能需要表单上的长选项的命令编写一个 Bash 完成脚本 option or param value 如果用户已经在命令行上输入了一个选项 则该选项应从完成列表中排除 假设仅在命令行上指定一次给定选项才有意义 这是第一次尝试 m
  • 如何使用存储在文本文件中的选项在 bash 中显示选择菜单? [复制]

    这个问题在这里已经有答案了 如何使用我存储在文本文件的各行中的选项为用户显示选择菜单 例如 我的文本文件 ingestion txt 如下所示 SOUP FTS CTS JDBC NEW 我希望用户看到这个 Please select an
  • awk 的 printf 插入多个变量的正确语法是什么?

    我复制了一些使用 printf 输出字符串在文件中出现的频率的代码 awk BEGIN print The number of times a appears in the file a a counter 1 END printf s n
  • 如何检测脚本是否正在被获取

    我有一个脚本 我不希望它调用exit如果它正在被采购 我想检查一下是否 0 bash但是如果脚本源自另一个脚本 或者用户从不同的 shell 获取它 例如ksh 有没有可靠的方法来检测脚本是否来源 稳健的解决方案bash ksh zsh 包
  • 无法在 Windows 10 上运行 Python 3.7“权限被拒绝”

    当尝试使用 Git Bash 在 Windows 10 上运行 Python 3 7 时 出现以下错误 python version bash c Users Name AppData Local Microsoft WindowsApps
  • 递归分割列表函数 LISP

    split list 函数接受一个列表并返回一个由两个列表组成的列表 其中两个列表由输入的交替元素组成 我写了以下内容 defun split list L cond endp L list NIL NIL t let X split li
  • Ansible 输出格式选项

    是否有一个选项可以使用 ansible 而不是任何其他脚本 来格式化 ansible 输出 例如 name Show version sudo true hosts web front end tasks name Create yum c
  • 如何让 STDOUT 和 STDERR 都转到终端和日志文件?

    我有一个脚本 将由非技术用户交互式运行 该脚本将状态更新写入 STDOUT 以便用户可以确定脚本运行正常 我希望将Stdout和STDERR重定向到终端 以便用户可以看到脚本正在工作 并查看是否存在问题 我还希望将两个流都重定向到日志文件

随机推荐

  • ASP.NET 中的基本表单身份验证有多安全?

    想象一下 您有一个只有 2 个页面的简单网站 login aspx 和 Secret aspx 仅使用 ASP net 表单身份验证和 login aspx 上的 ASP net 登录服务器控件来保护您的站点 详情如下所示 该站点配置为使用
  • 如何在mySQL中动态选择列名

    我想选择列名 但我事先不知道表结构 并且它可能会改变 所以我不能只用列名对 select 语句进行硬编码 我也不想选择每一列 有没有简单的方法可以做到这一点 我的想法是这两个查询的某种组合 但我的 SQL 不是那么好 SHOW COLUMN
  • 是什么导致我的参数超出范围异常? [复制]

    这个问题在这里已经有答案了 我试图测试我的列表是否正在从数据库收集数据 但是当我尝试获取消息框以从列表中打印邮政编码时 它给了我例外 System ArgumentOutOfRangeException 索引超出范围 必须为非负数且小于集合
  • Android 图像缓存 - 如何?

    我想以前已经问过很多次了 但仍然有些事情我不太明白 我尝试了两种不同的方法 将所有图像保留在内存中 当开始超过一定限制时 开始删除它们 让 Android 使用 SoftReferences 解决这个问题 2 有时 我分配它们时 它只是清理
  • 如何处理文件路径中的 ~

    我正在编写一个简单的命令行 Java 实用程序 我希望用户能够使用以下命令传递相对于其主目录的文件路径 操作员 所以像 Documents 我的问题是有没有办法让Java自动解析这种类型的路径 或者我是否需要扫描文件路径 操作员 看来这种类
  • 为什么 Perl 函数“map”给出错误“Map 参数不足”

    这是我不明白的事情 该脚本工作正常 注意映射函数中的串联 usr bin perl use strict use warnings use Data Dumper my aa map a gt 1 1 3 print Dumper aa E
  • 使用 Jinja2 在 html 文件中嵌入 png 图像

    我正在使用 Jinja2 将 html 报告创建为单个 html 文件 我想在 html 文件中包含公司徽标 而不是链接到它 这样 即使阅读报告的人处于离线状态 也会显示徽标 使用 Jinja2 可以自动完成此操作吗 如果不是 我如何手动在
  • 我可以阻止手机在网页上休眠吗

    在应用程序中我可以使用http developer android com reference android os PowerManager WakeLock html http developer android com referen
  • 虚函数表偏移量

    我想问一下 类的虚函数表的偏移量取决于什么 我的意思是 从我读到的内容来看 它至少取决于编译器 但它是否因类而异 编辑 通过偏移我的意思是表相对于所有者对象的地址的位置 编辑 示例代码 void vtable void char objec
  • 为什么在使用 MSpec/Moq 测试此异步方法时会收到 NullReferenceException?

    我想测试异步方法是否返回正确的类型 此方法使用依赖类中的另一个异步方法 依赖类实现此接口 Task
  • 在 dotnet core SDK 版本之间切换

    我最近安装了 VS 2017 RC 然后我的 dotnet 版本自动指向1 0 0 preview4 004233 因此 每当我使用命令创建新项目时dotnet new t Console我看不见project json虽然我看到 cspr
  • 如何在quarkus microprofile案例中配置rest客户端

    当使用 Quarkus microprofile 作为 REST 客户端时 如何配置底层 HttpClient 比如重试次数 每个主机的连接池大小等等 另外是否可以以某种方式强制客户端重新启动 因此连接池将重新启动 https downlo
  • 转发器内动态控件的视图状态问题

    最近 我在使用要添加动态控件的中继器时遇到了一个问题 虽然我有一个解决方法 在功能上完全符合我想要的功能 但我想知道是否有更好的方法为了我的理解 我使用 ASP NET 已经有大约 6 个月了 每次我认为我已经掌握了页面生命周期 视图状态时
  • 使用expect脚本从远程机器执行ssh

    我是expect脚本的新手 并且有一个用例 在该用例中 我需要从已经使用expect脚本完成ssh的机器上执行ssh 这是我的代码片段 usr bin expect f set timeout 60 spawn ssh email prot
  • 向 Google 地图添加多个标记

    我希望为 Google 地图 v3 API 中列出的每个商家添加标记在本页 http www inside guides co uk brentwood shops and shopping clothes shops html在右上角 我
  • 按列值动态过滤 jTable

    我需要根据特定列中的值动态过滤 JTable 因此 如果我有 2 列 例如 国家 地区 和 首都 我只想按 国家 地区 列进行过滤 我通过实现以下代码找到了问题的部分解决方案 import java awt BorderLayout imp
  • 在 t.string 的预定义值中进行选择

    是否有可能创建一个 collection select or select tag for a t string 用户可以在哪里选择字符串的预定义值 并且只允许将那些值存储在字符串的数据库中 例如 t string relationship
  • 使“gradle javadoc”任务与 Java 9 一起工作

    我有一个使用 source target 1 9 1 9 的多模块 Gradle Java 项目 有两个模块 my base and my dependsOnBase The my base模块没有其他依赖项 module my base
  • Spring 中的 ElasticSearch 与 @Query

    我已经使用 ElasticSearch 的 plugin head 接口成功创建了一个查询 该查询旨在返回特定位置的特定设备的最新时间戳 该查询如下所示 query bool must term deviceevent location i
  • 如何在 Bash 中拆分带引号的字符串?

    很少有问题 https stackoverflow com questions 918886 how do i split a string on a delimiter in bash关于如何通过给定分隔符拆分 Bash 脚本中的字符串有