![从较长的字符串中截取某一段字符串](https://linux22.com/image/899062/%E4%BB%8E%E8%BE%83%E9%95%BF%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E6%88%AA%E5%8F%96%E6%9F%90%E4%B8%80%E6%AE%B5%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我有字符串:
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。因此整行将^.*$
被与括号内的内容匹配的部分替换。