長い文字列から特定の文字列を切断する

長い文字列から特定の文字列を切断する

文字列があります:

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

Data で始まり、日付のようなもので終わるものをすべて削除します。

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 92 digits from 0 to 92 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 として扱われます。したがって、行全体が^.*$括弧内の内容と一致する部分に置き換えられます。

関連情報