基本的に、テキストファイルが渡され、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を使用します。バッシュシェル
編集しているので、実際に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
しかし、実際のファイルには、真ん中に印刷したくない空の行やものがあります。
まず第一に、それらのsedコマンドをチェックしてください。彼らはあなたが望むことをしていないかもしれません。たとえば、2番目の
sed -n s/dog/DOGGGG/g students.txt
あるべきだと思う
sed -i 's/dog/DOGGGG/g' students.txt
スクリプトを作成する前に、man sed
を読み、それらが個別に機能することを確認してください。
新しいファイル(つまり、nano yourscript.sh)を作成し、#!/bin/bash
をstudents.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を変更する権限がない場合のみです。
オプション1:シェルスクリプト内の各sed
コマンドを個別の行に配置し、-iスイッチを使用して所定の位置で動作するようにします。
オプション2:シェルスクリプトで単一のsed
コマンドラインを使用しますが、個別の-eスイッチを使用して各式を渡します。
オプション2は、式が直交している場合(つまり、同じ一致で動作しない場合)に優先されます。