为什么不能使用 cat 逐行读取文件,其中每行都有分隔符

2024-01-05

我有一个文本文件,其中包含如下内容:

abc 123, comma
the quick brown fox
jumped over the lazy dog
comma, comma

我写了一个脚本

for i in `cat file`
do
   echo $i
done

由于某种原因,脚本的输出不会逐行输出文件,而是在逗号和换行符处将其断开。为什么是cat or for blah in `cat xyz`这样做,我怎样才能让它不这样做?我知道我可以使用

while read line
do
   blah balh blah
done < file

但我想知道为什么cat or the for var in这样做是为了加深我对 Unix 命令的理解。cat的手册页没有帮助我并查看for or looping在 bash 手册中没有给出任何答案(http://www.gnu.org/software/bash/manual/bashref.html http://www.gnu.org/software/bash/manual/bashref.html)。在此先感谢您的帮助。


问题不在于cat,也不在for循环本身;这是在使用反引号。当您编写以下任一内容时:

for i in `cat file`

或更好):

for i in $(cat file)

or (in ksh, zsh or bash¹):

for i in $(<file)

shell 执行命令并将输出捕获为字符串,删除尾随换行符(以及 bash 中的所有 NUL),以分隔字符处的单词$IFS并且(zsh 除外)执行globbing aka 文件名生成 aka 路径名扩展关于结果的话。如果你想将行输入到$i,你要么必须摆弄IFS或使用while环形。这while如果存在处理的文件很大的危险,则循环更好;它不必一次将整个文件读入内存,并且不执行通配符,也不会跳过空行,这与使用的版本不同$(...).

IFS='
'
set -o noglob # disable globbing
for i in $(<file)
do printf '%s\n' "$i"
done

周围的报价"$i"通常是个好主意。在此背景下,通过修改$IFS,并且禁用通配符,这实际上并不重要,但即使如此,好习惯仍然是好习惯。printfecho, as echo对于包含以下内容的输入行将不输出任何内容或空行-n, -nene, -eee或取决于echo实现和/或环境 mangle 反斜杠。这在以下脚本中很重要:

old="$IFS"
IFS='
'
set -o noglob
for i in $(<file)
do
   (
   IFS="$old"
   set +o noglob
   printf '%s\n' "$i"
   )
done

当数据文件包含表格或多个空格时(两者都在默认值$IFS) 或通配符或前导尾随空格

$ cat file
abc                  123
  foo
-Enee
/e* /b*
$ 

Output:

$ sh bq.sh
abc                  123
  foo
-Enee
/e* /b*
$

With echo并且没有双引号:

$ cat bq.sh
old="$IFS"
IFS='
'
set -o noglob
for i in $(<file)
do
   (
   IFS="$old"
   set +o noglob
   echo $i
   )
done
$ sh bq.sh
abc 123
foo
/etc /bin /boot
$

For the while read循环,语法应该是:

while IFS= read -r line
do
   printf '%s\n' "$line"
done < file
  • without -r, read会破坏反斜杠
  • without IFS=, read将删除前导和尾随空格以及制表符(假设默认值为$IFS).
  • printf应该使用而不是echo, and $line引用的原因与上述相同。

¹ Though in bash it's much less of an optimisation as bash still forks a child process to perform the expansion.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不能使用 cat 逐行读取文件,其中每行都有分隔符 的相关文章

  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • “/bin/bash -l”无效选项

    好吧 我正在尝试在我们的超级计算机上运行隐藏为一项作业的串行 MPI 作业 主要提交脚本基本上如下所示 bin bash l PBS l nodes 4 ppn 8 walltime 24 00 00 cat PBS NODEFILE un
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 终端关闭时 bash 收到的信号

    使用 trap 来捕获信号 如下所示 i 1 while i lt 33 do trap echo i gt gt log txt i done 并强行关闭终端 那么log txt中的内容就是 redhat linux下 1 18 1 17
  • 如何使用 mediawiki 的 api、curl 和 bash 登录?

    我对流程的理解 来自 mediawikis 登录手册https www mediawiki org wiki API 登录 https www mediawiki org wiki API Login 使用 MediaWiki 的 Web
  • 为什么 Git Bash 无法运行我的可执行文件?

    I am on git for windows https github com git for windows 吉特 巴什 我无法在命令行上运行可执行文件 Pedr Abc 07 MINGW64 c dev ls sqlite3 exe
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • 如何检查主机是否在您的known_host ssh中

    我的脚本中使用以下命令 将主机添加到 ssh 中的已知主机 VAR2 expect c spawn ssh o StrictHostKeyChecking no REMOTE HOST USER REMOTE HOST IP expect
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 在 macOS 上使用 find 时出现“非法选项”错误

    我试图列出末尾仅带有字母 R 的文件 我用了find在 macOS 终端中如下所示 find type f name R 但我收到消息说illegal option t 第一个参数find是它应该开始寻找的路径 路径 表示当前目录 find
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 测试 bash shell 脚本[重复]

    这个问题在这里已经有答案了 有人可以解释一下如何测试 bash shell 脚本吗 例如 我有一个 sh 文件 其中包含此代码 bin sh for file in txt do mv file basename file txt doc
  • Bash 中单行 while 循环的语法

    我无法找到分号和 或大括号的正确组合 我想这样做 但作为命令行中的一句 while 1 do foo sleep 2 done while true do foo sleep 2 done 顺便说一句 如果您在命令提示符下将其输入为多行 如

随机推荐

  • 添加 LTV 签名后,某些 pdf 文件已损坏

    我正在尝试在数字签名文档中添加 LTV 在某些文件中 它工作正常 但在某些文件中 它不起作用 我附上所有文件以供参考 我的 LTV 添加代码链接如下https github com akr pdftimestamp https github
  • 上下文包与完成通道以避免 goroutine 泄漏

    有两种不同的方法来清理 goroutine 使用kill 通道来发出取消信号 并使用done 通道来指示goroutine 已终止 type Worker struct Done chan struct Kill chan struct J
  • Tesseract 不使用路径变量

    为什么我的 Tesseract 实例要求我显式设置数据路径 但不想读取环境变量 让我澄清一下 运行代码 ITesseract tesseract new Tesseract String result tesseract doOCR myI
  • 使用react-pdf和react-chartjs-2生成pdf

    我环顾四周 但似乎找不到任何一起使用这两个库的示例 我的项目当前使用react pdf 生成pdf 报告 但我需要将chartjs 图表添加到我们将生成的一些新文件中 我不想使用两个不同的 pdf 库 也不必重新编码应用程序的某些部分以匹配
  • 在 Ubuntu 12.04 上完全删除并全新安装 python

    承认这一点很尴尬 但我只是继续努力在 Ubuntu 安装上设置我的 Python 环境 有时我让它工作得很好 但问题是 我觉得每当我坐下来对 python 项目进行一些业余爱好时 我最终都会花费几个小时来解决与我的 python 安装不一致
  • c# .NET CORE 使用 ITextSharp 将透明图像添加到现有 PDF

    我的目标是在现有 pdf 的每一页上添加公司徽标 不是水印 由于 pdf 文件和徽标的具体情况 我只能将徽标放置在 pdf 内容的顶部 而不是下面 并且徽标必须支持透明度 还有一个限制是我必须使用 NET Core 发布此内容并给出答案 因
  • Excel 中的错误消息

    在将 Excel ApplicationClass 的 DisplayAlerts 属性设置为 false 时 我遇到了以下错误的紧急问题 var excel new Excel Application excel DisplayAlert
  • Silverlight图像编辑器控件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 您是否知道任何 Silverlight 图像编辑器 控件 商业或开源 主要功能要求 裁剪 调整大小 旋转图像 设置背景颜色 插入文字 插入
  • 如何在 Java 中查找 2D 数组中的子数组是否具有特定的和?

    我试图通过比较源图像和图案图像中存在的像素的平均颜色来解决图像匹配问题 我已将这个问题简化为子数组求和问题 但无法找到解决方法 假设我有一个包含所有正整数的二维数组 ARR 我有一个数字 x 它是小图案图像中存在的像素颜色的平均值 我只需要
  • iPhone - 从另一个视图控制器调用函数

    我有一个名为 sendDataToMotor 的函数 它在我的第一个视图控制器类中 我有另一个名为 SecondViewController 的视图控制器 我需要从 Second View Controller m 类调用此函数 我尝试申报
  • haproxy 全局 maxconn 和服务器 maxconn 的区别

    我对我的 haproxy 配置有疑问 Global settings global log 127 0 0 1 syslog emerg maxconn 4000 quiet user haproxy group haproxy daemo
  • 如何测量并显示单个测试的运行时间?

    我有一个可能需要长时间运行的测试分级测试 test a long running test failAfter Span 60 Seconds 即使测试在超时限制内完成 其运行时间对于运行测试的人来说也是有价值的 我如何测量并显示这个的运行
  • 将 WriteableBitmap 保存为 PNG

    如何将 WriteableBitmap 保存为具有透明背景的 PNG PNG 和带有透明度的 PNG 有区别吗 感谢你的帮助 请给我看示例代码 谢谢 只需浏览以下链接即可 希望这可以帮助你 使用 WPF 将 WriteableBitmap
  • 我如何获得有关谁调用了某个方法的信息?

    我想获得一些有关谁调用了特定方法的信息 也就是说 如果可能的话 获取进行调用的方法的行号和文件名 类似于FILE and LINE 除了堆栈中的下一层 这在高级语言中是可能的 但是在 Objective C 中有什么方法可以做到这一点吗 v
  • 如何调试 Grunt Mocha 任务?

    我正在使用 WebStorm 来运行 grunt 任务 调试器成功停止在 Gruntfile js 文件中的断点处 但不在我的任务文件中 在 Gruntfile js 中 我注册了一个如下任务 grunt initConfig config
  • 错误消息“ENOENT,没有这样的文件或目录”

    我从 Node js 应用程序中收到此错误 ENOENT 没有这样的文件或目录 Desktop MyApp newversion partials navigation jade 我知道该文件在那里 因为当我尝试使用精确复制和粘贴的路径打开
  • jQuery UI 选项卡 - 深度链接到选项卡内容

    我不确定目前这是否可能 而且我所做的测试似乎提供了奇怪的结果 我在一页上有 4 个选项卡 这些选项卡内有几个文本部分 每个部分都有一个唯一的锚点名称 我想做的是从另一个页面链接到选项卡 3 中的第四个内容块 这些选项卡都工作得很好 如果我链
  • 将参数传递给 Go IIFE(以下 javascript 示例)

    我习惯于在 javascript 中进行编程 我可以执行以下操作将参数传递到立即调用的函数表达式中 function twoSeconds do something with twoSeconds here 2 1000 所以我希望能够在
  • PostgreSQL - 从函数返回 n 大小的 varchar

    正如我在文档中发现的 带括号的类型修饰符 例如 类型的精度字段 numeric 被 CREATE FUNCTION 丢弃 是否有其他方法可以从 plpgsql 函数返回 varchar N 类型 问题更新 在图片上 您可以看到 Name 列
  • 为什么不能使用 cat 逐行读取文件,其中每行都有分隔符

    我有一个文本文件 其中包含如下内容 abc 123 comma the quick brown fox jumped over the lazy dog comma comma 我写了一个脚本 for i in cat file do ec