私は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