我有字串:
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。因此整行將^.*$
被與括號中的內容相符的部分取代。