sedが貪欲に一致しない

sedが貪欲に一致しない

私はsedが貪欲ではないマッチングをすることができないと思います。 sedが改行文字と一致しないようにする方法はありますか?

私は次のようにsedを使用していますが、後者(. *)は期待どおりにすべてに一致しますが、望ましくない新しい行も一致します。

sed -i -s -r 's|^([A-Za-z0-9*()])(.*)|INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "\1\2", "" )|' /path/to/files/*

私が得た結果は次のとおりです。

INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Some text
", "" )

ベストアンサー1

私の入力ファイルの1つが次のような場合

Abba
Ebbo
Obbe

...これにより、コマンドは次のように変更されると予想されます。

INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Abba", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Ebbo", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Obbe", "" )

ただし、入力ファイルがCRLF行末を持つDOSテキストファイルの場合、末尾のキャリッジリターンの結果は次のようになります。

", "" )INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Abba
", "" )INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Ebbo
", "" )INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Obbe

...ファイルがUnixシステムで処理されている場合。

これは、キャリッジリターン文字が端末で解釈されると、カーソルを行の先頭に戻すためです。

これ実際この場合、データは(\rキャリッジリターン記号で表されます)です。

INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Abba\r", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Ebbo\r", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Obbe\r", "" )

この問題を解決するには、入力ファイルをDOSテキストファイルからUnixテキストファイルに変換します。これは、次のツールを使用して一括で実行したり、コマンドの一部として実行したりdos2unixできます。sed

sed -i \
    -e 's/[[:space:]]$//' \
    -e 's/^[[:alnum:]*()].*/INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "&", "" )/' files

最初の式は各行の末尾からスペースに似た文字を削除し(キャリッジリターンはその1つです)、2番目の式は置換を実行します。

行番号に依存せず、拡張正規表現のサポートは必要ないため、-sおよびは必須ではありません。-r

おすすめ記事