從較長的繩子上剪下特定的繩子

從較長的繩子上剪下特定的繩子

我有字串:

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

相關內容