(2020/04/05 18:30旧タイトル[複数ファイルに対して指定文字列が含まれる次の行以降を削除したい]から修正)
複数ファイルに対して指定文字列が最初にマッチした行の2行後から最終行までを削除したい
あるディレクトリに複数個ある指定書式のテキストデータを、条件に合わせて一括置換したいと考えています。
###テキストの形式
20160101 Sapporo 20160302 Utsunomiya 20160422 Morioka 20160812 Sendai 20161111 Tsu 20161221 Mito 20170106 Koufu 20170505 Takamatsu ︙ 20191030 Matsue 20191231 Nagoya 20200111 Matsuyama 20200303 Naha 20200311 Nagoya 20200401 Maebashi 20211231 Yokohama 20210303 Ootsu ︙
このような日付 都市が一行おきにあるsample.txtの最初に1231が~~(18:30修正)ヒットした次の行以降~~マッチした行の2行後から最終行までを削除したく、
この例ですと20200111 Matsuyama以降を削除したいです。
(15:49追記)1231の次にどの日付が来るかはランダムです。
試したこと
1, find . -name "*.txt" | xargs sed -i "/1231/,$ d"
20191231 Nagoya から削除されてしまう
2, find . -name ".txt" | xargs sed -i "/1231/a Insert"
で、20191231 Nagoyaの次の行に削除用の行を挿入、その後
find . -name ".txt" | xargs sed -i "/Insert/,$ d"
で削除用行以下を一括削除
20200111 Matsuyama が残らない
3, sed -i "$((sed -n '/1231/=' test.txt
+ 2))i\Inserted." test.txt
で20200111 Matsuyama の次行にInsertの挿入を試みる。単一のファイルに対して実行できたが、複数ファイルに適応しようと
find . -name "*.txt" | xargs sed "$((sed -n '/Nagoya/=' *.txt
+ 2))i\Inserted."
を行うと
bash: 181
419 + 2: 式に構文エラーがあります (エラーのあるトークンは "419 + 2")
とエラーが出る。
(15:49追記)
4, cat test.txt | sed -e "/1231/,$ d" -e "/1231/,+1p"
削除が先に行われるのでマッチする行+1行を出力が反映されなかった。
(18:30追記)
5, find . -name "*.txt" | xargs sed -i "/1231/q"
20200111 Matsuyama が残らない、複数ファイルに適応時に1ファイルしか変更が反映されない。
環境
Ubuntu 16.04 LTSで実行しています。
上記はググッて見つけた例をの試行錯誤で切り貼り・改変してみたものです。
実行可能な方法があればsed以外でも大丈夫です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/05 06:48
2020/04/05 08:10 編集
2020/04/05 08:37 編集
2020/04/05 08:55
2020/04/05 09:57
2020/04/05 10:04
2020/04/05 10:45