与えられた行番号で sed 操作を実行します。

与えられた行番号で sed 操作を実行します。

事前に割り当てられた行番号を使用して特定の行を簡単に操作する方法があるかどうか疑問に思います。

ファイルの1、7、14、16行を出力したいと仮定すると、簡単に次のようにできます。

sed -n '1p;7p;14p;16p' input_file

しかし、ジョブが単純な印刷以上のジョブの場合は、より複雑になり、同じ長いコマンドを4回作成したくありません(たとえば、同じbash変数を4回置き換えてこの長いsedコマンドを構成できることを知っていますが、これは十分に理想的です。いいえ...)、つまり

sed -n '1{long_command};7{long_command};14{long_command};16{long_command}' input_file

私のファイルの特定の行を操作する方法はありますか?似たような内容を期待していましたが、

sed -n '1,7,14,16p'

これは確かに現在の形式では機能しません。

どんな助けでも大変感謝します。 「いいえ、それは不可能です」説明があれば、答えも受け入れることができます。

答え1

ブランチを使用できます。

sed '
  1b1
  7b1
  14b1
  16b1

  # for the rest to be left alone, branch off (or delete them with "d"):
  b

  :1
  long_command'

20,25b1(一部の行範囲を追加したり、/re/b1一致する行を含めたりすることもできますre。)

または、次のものを使用できますawk

awk 'NR == 1 || NR == 7 || ... {stuff}'

またはハッシュを使用してください。

awk -v l=1,7,14,16 '
  BEGIN{split(l, a, ","); for (i in a) lines[a[i]]}

  NR in lines {stuff}'

(またはBEGIN{lines[1]lines[7]lines[14]lines[16]}多すぎない場合)

答え2

選択項目を反転して削除するだけです。

sed '2,6d;8,13d;15d;17,$d;long_command'

答え3

最初のバリエーション:

次のトリックを使用できます。

sed -nf <(printf '%dp\n' 1 7 14 16)

- F スクリプトファイル- 実行する命令にスクリプトファイルの内容を追加します。

テスト

seq 1 20 | sed -nf <(printf '%dp\n' 1 7 14 16)

出力

1
7
14
16

2番目の変形:

最初は、セカンダリファイルをsed使用してファイルから必要な行のみをフィルタリングし、長いsedコマンドを使用してその行をプライマリファイルにパイプします。

sed -n '1p; 7p; 14p; 16p' input.txt | sed 'long command'

関連情報