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