【问题标题】:bash grep regex from start of the string to variablebash grep 正则表达式从字符串的开头到变量
【发布时间】:2017-03-16 23:19:21
【问题描述】:

我有一个包含以下字符串的文件,需要将带有数字的文件夹的路径分配给变量:

/tmp/gfh/000000004802803/blablabla/EngID_Consolidation.zip
/tmp/vcbn/000000005395825/blablabla/172_6578-DUMP_NOMServer.zip
/tmp/one3/435876dfhg/000000004017051/5.zip
/tmp/one3/dsfkgjh/dsjfhgfd/000000004617319/Sybase.zip

例如我需要分配变量: /tmp/gfh/000000004802803/

数字和路径总是不同的。作为第一步,我使用正则表达式将数字分配到变量文件夹中:

zip_folder_name0=$(grep -E -o "/([0]{5}[0-9]{10})/" <<< $zip_path)
zip_folder_name=${zip_folder_name0#"/"}
zip_folder_name=${zip_folder_name%"/"}
echo $zip_folder_name

返回000000004802803 如何将根文件夹的所有路径分配给另一个变量? 我认为它可以通过正则表达式来完成,从字符串的开头到变量 $zip_folder_name。这可能吗?或者也许还有其他方法?

UPD1 忘了提一下,后面有数字的文件夹可以是另一个文件夹,例如/tmp/gfh/000000004802803/blablabla/EngID_Consolidation.zip 我正好需要 /tmp/gfh/000000004802803/ 到变量中。

【问题讨论】:

  • 用更多细节更新问题
  • 数字总是第三个字段吗?路径中是否有其他文件夹只有数字? (即你可以有/tmp/gfh/ijk/012345/myzip.zip/tmp/gfh/0123/4567/myzip.zip 吗?)
  • 总是有15位的文件夹,但前后可以是数字和字母混合的文件夹。不,没有其他名称严格为 15 位的文件夹,但可以是多于或少于 15 位的文件夹。例如。 /tmp/gfh/000000004802803/123456/EngID_Consolidation.zip。

标签: regex bash variables


【解决方案1】:

下面是一个脚本,它将一个输入参数输入$IN_STR,并输出你需要的字符串**

#!/bin/bash

BASE_REGEX="[0-9]{15}"
IN_STR=$1

FIFTEEN_DIGIT_DIR_NAME=`echo $IN_STR | grep -E -o "$BASE_REGEX"`
FIFTEEN_DIGIT_DIR_CONTAINER=`echo $IN_STR | grep -Po ".*(?=$BASE_REGEX)"`

echo $FIFTEEN_DIGIT_DIR_CONTAINER$FIFTEEN_DIGIT_DIR_NAME

输出:

/tmp/gfh/00000000480280

解释:
grep -P:Perl 表达式
-o:只匹配
.*:重复所有内容
(?=):查询字符串
[0-9]:任意数字
{15} : 15 个字符

**来自 cmets 的要求是:直到文件夹名称正好包含 15 位数字的路径,包括该文件夹本身的名称。

【讨论】:

  • 你能用 /tmp/gfh/000000004802803/12345 修改正则表达式来修改变体吗? (嵌套文件夹只能包含数字,但不会包含严格的 15 位作为父文件夹)。
  • 对不起,我不明白,您不想希望最后一个12345 包含在变量中吗?
  • 是的,我想剪掉12345,只剩下/tmp/gfh/000000004802803/
  • 哦,好吧..会改变答案,但不会是修正,对不起!
  • 太棒了!感谢您的解决方案,对不起我的英语不好:(
【解决方案2】:
while read line; do        
   dir=$(grep -oE .*/[0-9]+/ <<< $line|tr -d / )
   echo dir=$dir num=$num 
done < zips.txt 

> dir=/tmp/gfh/000000004802803/
> dir=/tmp/vcbn/000000005395825/
> dir=/tmp/one3/435876dfhg/000000004017051/
> dir=/tmp/one3/dsfkgjh/dsjfhgfd/000000004617319/

【讨论】:

  • 可能需要read -r。并记住参数扩展周围的引号。
  • 忘了提一下,后面有数字的文件夹可以是另一个文件夹,例如/tmp/gfh/000000004802803/blablabla/EngID_Consolidation.zip 我需要将 /tmp/gfh/000000004802803/ 放入变量中。很遗憾,您的答案是不可能的。
  • 当我在一个 15 位数字的文件夹之后有一个嵌套文件夹时,它返回 dir=/tmp/gfh/000000004802803/blablabla/
猜你喜欢
  • 2023-03-15
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
相关资源
最近更新 更多