linux 使用正则表达式的哈希子字符串

ryhaxcpt  于 2023-01-20  发布在  Linux
关注(0)|答案(5)|浏览(182)

在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'}
...

但我想用一种更简洁的方式来创建它,使用exprsedawk命令。
谢谢

    • 编辑日期:**

我找到了另一种方法(不过,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
qni6mghb

qni6mghb1#

下面的解决方案使用seds/(替换)来删除前导部分和尾随部分:

echo "This is the file.txt from my folder." | sed "s/^This is the \(.*\) from my folder.$/\1/"

输出:

file.txt

\(\)包含了我们想要保留的部分,这被称为group,因为它是我们在这个表达式中使用的第一个(也是唯一的)组,所以它是group 1,我们稍后在替换字符串中用\1引用这个组。
^$符号确保完整的字符串匹配。只有在文件名包含"from my folder.""This is the"的特殊情况下才需要这样做。

avkwfej4

avkwfej42#

您可以尝试grep:

var=$(egrep -o file.txt)
sxissh06

sxissh063#

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

mdfafbf1

mdfafbf14#

不需要使用sedawk。从2004年开始,bash就内置了与=~操作符匹配的正则表达式。

input="This is the file.txt from my folder."
[[ $input =~ ([[:alnum:]]+\.[[:alnum:]]+) ]]
echo ${BASH_REMATCH[0]}

输出:

file.txt

如果您不习惯编写正则表达式,那么使用regex101进行交互式操作会更容易。对于bash,请使用其默认的PCRE(perl兼容正则表达式)风格。

yzckvree

yzckvree5#

使用gawk

gawk '_<($_ = RT)' RS='[^ /\0]+[.][^\0/\n ]+'

file.txt

"_"在这里有两个不同的(隐含的)用途:

  • <左边,是一个空字符串""
  • <右侧,用作数字零,生成$0

相关问题