【问题标题】:bash regex matching multiple leading spaces in if-statementbash正则表达式匹配if语句中的多个前导空格
【发布时间】:2015-04-15 05:56:23
【问题描述】:

我正在使用 bash 读取包含完整路径文件名的文本文件。有些将 fwd-slash 开头作为第一个字符,但大多数缩进三个空格,如下所示:

/my/top/level/file
   /my/top/level/file/one_more.txt
   /my/top/level/file/two_more.txt

读取文件没有问题,问题是我似乎无法想出正确的模式匹配来从这些缩进行中获取文件名。我正在使用这个:

if [[ $line =~ ^([[:space:]][[:space:]][[:space:]])(.*)$ ]] ; then
    filename_indented=${BASH_REMATCH[2]}
else
    filename=$line
fi

我认为 bash 模式匹配并不像真正的正则表达式那样复杂,但我希望将解决方案保持为全 bash,不使用 sed。

那么有什么诀窍呢?我感觉到微妙之处正在发生。

【问题讨论】:

  • 不知道为什么你需要 [[:space:]] 引用空间就足够了。
  • 我认为您的解决方案应该有效。以上有什么问题?
  • 你得到的输出是什么?如果您使用while read,那么前导空格将被截断,else 子句将正常工作。那就是你根本不需要使用任何正则表达式匹配。您编写的代码是正确的,并且如果您分配像line=" test" 这样的变量并带有前导空格,则可以正常工作。

标签: regex bash


【解决方案1】:

如果您正确读取文件,read 将自动修剪前导空格:

$ while read -r line; do echo "fname '$line'"; done < dat/filenames.txt
fname '/my/top/level/file'
fname '/my/top/level/file/one_more.txt'
fname '/my/top/level/file/two_more.txt'

【讨论】:

  • 确实有细微之处!我在 bash 中工作不多,不知道它神奇地吃掉了前导空格。是的,删除所有匹配的内容并仅使用简单的 while read 就像一种魅力。感谢所有回复的人。但是,如果我的缩进有意义并且我不想通过阅读来吃掉空白,那么我可以根据它的存在与否建立一些逻辑呢?
  • 在我的 while 子句中包含 IFS='' 允许我的原始代码正确工作,以区分带有前导空格的行和没有前导空格的行。感谢所有回复的人。
  • Internal Field S分隔符设置为 IFS=" 将导致您的脚本挂起等待结束报价。设置IFS=""(空字符串/null) - 不发生分词。如果保留默认值:&lt;space&gt;&lt;tab&gt;&lt;newline&gt;,则忽略开头或结尾的任何 &lt;space&gt;, &lt;tab&gt;, and &lt;newline&gt; 序列。
猜你喜欢
  • 2013-09-13
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
相关资源
最近更新 更多