带有正则表达式的 Bash 子字符串
Posted
技术标签:
【中文标题】带有正则表达式的 Bash 子字符串【英文标题】:Bash substring with regular expression 【发布时间】:2013-10-21 19:17:12 【问题描述】:在 bash 脚本中,我想从给定的字符串中提取 variable 字符串。我的意思是,我想从字符串中提取字符串file.txt
:
This is the file.txt from my folder.
我试过了:
var=$(echo "This is the file.txt from my folder.")
var=echo $var##'This'
...
但我想以更简洁的方式使用expr
、sed
或awk
命令。
谢谢
已编辑:
我找到了另一种方法(尽管如此,sed 命令的答案对我来说是最好的):
var=$(echo 'This is the file.txt from my folder.')
front=$(echo 'This is the ')
back=$(echo ' from my folder.')
var=$var##$front
var=$var%$back
echo $var
【问题讨论】:
【参考方案1】:以下解决方案使用sed
和s/
(替换)来删除前导和尾随部分:
echo "This is the file.txt from my folder." | sed "s/^This is the \(.*\) from my folder.$/\1/"
输出:
file.txt
\(
和\)
包含我们要保留的部分。这称为组。因为它是我们在这个表达式中使用的第一个(也是唯一一个)组,所以它是第 1 组。我们稍后在替换字符串中使用 \1
引用这个组。
^
和 $
标志确保匹配完整的字符串。这仅在文件名包含"from my folder."
或"This is the"
的特殊情况下是必需的。
【讨论】:
【参考方案2】:你可以试试grep:
var=$(egrep -o file.txt)
【讨论】:
【参考方案3】:如果'file.txt'是一个固定的字符串,并且不会改变,那么你可以这样做:
var="This is the file.txt from my folder"
请注意,您不需要将字符串回显到变量中,只需在二进制“=”运算符的右侧键入即可。
echo $var |sed -e 's/^.*\(file\.txt\).*$/\1/'
根据您的 sed(1) 版本,如果您在 sed(1) 中有 -r(扩展正则表达式)选项,则可以取消括号的转义。
如果“file.txt”发生变化,您可以尽最大努力创建一个模式,例如:
echo $var |sed -e 's/^.* \([^ ]\+\.[^ ]\+\) .*$/\1/'
【讨论】:
以上是关于带有正则表达式的 Bash 子字符串的主要内容,如果未能解决你的问题,请参考以下文章