以下を含むテキストファイルがある場合:
someline
<!--\
file first read on 2015/01/11
「on」以降のすべての項目を削除したいと思います<!--\
。どうすればいいですか?上記の例で予想される出力は次のとおりです。
someline
2015/01/11
私は日付を抽出するパターンを作成できません。その理由は、2015/01/11
それが単なるものSunday
でもYesterday
ほぼ異なるものである可能性があるからです。read
何でもできます。私はBSDで試しましたsed
:
sed 's/<!--\
file first .* on//g'
ただし、このコマンドを実行すると、次のエラーが発生します。
sed: 1: "s/<!--\
file f ...": unterminated substitute pattern
そのため、バックスラッシュをエスケープしようとしましたが、<
同じ!
「終了しない代替パターン」エラーが発生します。私はGNU sedのインストールを試みて同じことをしましたが、それ以外は試しましたが、次のような\n
結果gsed 's/<!--:a;N;$!ba;s/\n/file first .* on//g'
が出ました。
gsed: -e expression #1, char 22: unknown option to `s'
これはできませんかsed
?それ以外の場合は、他のツール/言語を使用してどのようにこれを実行できますか?
答え1
POSIX的に:
$ sed -e '/<!--/{
$!N
s/.*on //
}' <in >out
答え2
次のsed
コマンドは必要な操作を実行する必要があります。
sed '/^<!--/{N; s/.*on *//}' inputfile
<!--
まず、行の先頭から正規表現を検索してから、コマンドを使用して次の行を追加し、N
「on」までのすべての項目を削除します(実際には何も変更しません)。
sed
たとえば、コマンドに大文字を使用するたびにN
誤ったツールを使用していると主張している人もいます。
答え3
Perlは、改行文字と一致する-0777
修飾子を使用してファイル全体を読み取ることができます。/s
.
perl -0777 -pe 's/<!--\\.*?on //gs'
*?
「チェックされたアスタリスク」とは、「0回以上繰り返すが、できるだけ短い文字列と一致する」ことを意味します。