从较长的字符串中截取某一段字符串

从较长的字符串中截取某一段字符串

我有字符串:

fvvDataFolders/DDB/DDB2018-02-21oM]
fbbDataFolders/DDB/DDB2018-02-22oM]

我想删除以数据开头并以日期结尾的所有内容:

DataFolders/DDB/DDB2018-02-21
DataFolders/DDC/DDB2018-02-22

我怎样才能做到这一点?

答案1

任何一个

grep -P -o 'Data.+?\d\d\d\d-\d\d-\d\d'

或者

perl -pe 's/^.+(Data.+?\d\d\d\d-\d\d-\d\d).+$/$1/'

Data就可以了。它们都打印以日期 (YYYY-MM-DD)开头和结尾的最小字符串。

echo "fvvDataFolders/DDB/DDB2018-02-21oM]" > input.txt
echo "fbbDataFolders/DDB/DDB2018-02-22oM]" >> input.txt
grep -P -o 'Data.+?\d\d\d\d-\d\d-\d\d' input.txt

# output:
DataFolders/DDB/DDB2018-02-21
DataFolders/DDB/DDB2018-02-22

perl -pe 's/^.+(Data.+?\d\d\d\d-\d\d-\d\d).+$/$1/' input.txt

# output:
DataFolders/DDB/DDB2018-02-21
DataFolders/DDB/DDB2018-02-22

答案2

grep您可以按照下列方式使用该命令:

grep -oP 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}' input-file > output-file
  • -o, --only-matching——仅显示与 PATTERN 匹配的行的部分。
  • -P, --perl-regexp-PATTERN 是 Perl 正则表达式;或者在这种情况下也可以使用选项-E, --extended-regexp-PATTERN 是扩展正则表达式 (ERE)。
  • 正则表达式'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}'符合您的要求。它以字符串开头Data,后跟未知数量*的任意字符.,并以日期格式结尾:4 digits from 0 to 9破折号2 digits from 0 to 9破折号2 digits from 0 to 9

这里也提供一个sed解决方法:

sed -r 's/^.*(Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}).*$/\1/' /tmp/input-file 
  • 将输出重定向到新文件> output-file或使用该选项-i.bak在其位置进行更改并创建备份文件。
  • -r, --regexp-extended——在脚本中使用扩展正则表达式。
  • 该命令的s意思是替代:/<string-or-regexp>/<replacement>/
  • ^.*^将匹配到行首,后面跟着未知数量的任意字符。
  • .*$$将匹配到行尾,前面是未知数量的任意字符。
  • 在 中,捕获组(...)会被视为变量 \1。因此整行将^.*$被与括号内的内容匹配的部分替换。

相关内容