7

在 bash 脚本中,我想从给定的字符串中提取变量字符串。我的意思是,我想从字符串中提取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,sedawk命令。

谢谢

编辑:

我找到了另一种方法(尽管如此,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
4

3 回答 3

16

以下解决方案使用sedwith 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"

于 2013-10-14T08:59:39.013 回答
1

你可以试试grep:

var=$(egrep -o file.txt)
于 2013-10-14T09:00:42.407 回答
1

如果 '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/'

于 2013-10-14T09:01:16.780 回答