web-dev-qa-db-ja.com

すべてのsedコマンドを1つのシェルスクリプトファイルに配置します

基本的に、テキストファイルが渡され、sedコマンドを使用してねじ込むことになっています。合計約7個のsedコマンドがあり、このスクリプトを実行するときに1つの出力を生成するには、すべてを1つのシェルスクリプトに入れる必要があります。

ねじ込み対象のテキストファイル:students.txt

Students.txt:

DogG DOGGGGGGGG
dog dog dog Jamesb
JamesBrady
derghnregnrig
JamesBeody

したがって、最初のsedは最初と最後の行を取り除きます。 2番目のsedはdogをDOGGGGに置き換え、3番目のsedはすべての行を検索して出力し、w/JamesBrady 4番目のsedは検索してすべての行をderghnregnrigで出力します

Sedコマンド(BSの例):

sed -e '1d' -e '$d' -e '/^$/d' students.txt
sed -n s/dog/DOGGGG/g students.txt
sed -n /JamesBrady/p students.txt
sed -n /derghnregnrig/p students.txt

上記のsedコマンドはすべて1つのシェルスクリプトファイルに入れられ、実行時に1つのテキストファイル(students.txt)に(累積?)効果を出力することになっています。

これまでのところ、これを行うための正しい手順を調べてみましたが、混乱以外の何ものでもありません。誰かが、複数のsedコマンドやコマンド(awk、grepなど)がどのように単一のシェルスクリプトファイルに収まるのか、初心者の忍耐で明確に説明できますか?

Ubuntu 16.04、Vimを使用します。バッシュシェル

3
KMoy

編集しているので、実際にDOGGGGの行を見たいと思います(そうでなければ、なぜわざわざ?)

{}を使用して、ブロック内のコマンドをグループ化します...

sed -n '{
       1d
       $d
       /^$/d
       s/dog/DOGGGG/g
       /DOGGGG/p
       /JamesBrady/p
       /derghnregnrig/p
}' students.txt

結果:

  DOGGGG DOGGGG DOGGGG Jamesb
  JamesBrady
  derghnregnrig

あなたはあなたの例のためにすべてを必要としません...

sed -n '{
       1d
       $d
       s/dog/DOGGGG/g;p
}' students.txt

しかし、実際のファイルには、真ん中に印刷したくない空の行やものがあります。

7
Zanna

まず第一に、それらのsedコマンドをチェックしてください。彼らはあなたが望むことをしていないかもしれません。たとえば、2番目の

sed -n s/dog/DOGGGG/g students.txt

あるべきだと思う

sed -i 's/dog/DOGGGG/g' students.txt

スクリプトを作成する前に、man sedを読み、それらが個別に機能することを確認してください。

新しいファイル(つまり、nano yourscript.sh)を作成し、#!/bin/bashstudents.txtに置き換えて、$1に続いてsedコマンドを記述します。この$1は、スクリプトを呼び出すときの最初の引数を表します。

#!/bin/bash
sed -e '1d' -e '$d' -e '/^$/d' $1
sed -n s/dog/DOGGGG/g $1
sed -n /JamesBrady/p $1
sed -n /derghnregnrig/p $1

正しいsedコマンド。次に、スクリプトの実行権限を付与します。

Sudo chmod 755 yourscript.sh

そして、ファイル名を最初の引数として実行します:

Sudo ./yourscript.sh students.txt

この最後のコマンドでSudoが必要なのは、ユーザーにstudent.txtを変更する権限がない場合のみです。

3
Katu

オプション1:シェルスクリプト内の各sedコマンドを個別の行に配置し、-iスイッチを使用して所定の位置で動作するようにします。

オプション2:シェルスクリプトで単一のsedコマンドラインを使用しますが、個別の-eスイッチを使用して各式を渡します。

オプション2は、式が直交している場合(つまり、同じ一致で動作しない場合)に優先されます。

0
Stephen M. Webb