FC2ブログ
スポンサーサイト



[bash] 配列宣言及び内容表示

■ declare -a 配列名=("要素1" "要素2" ・・・) にて、配列を宣言可能。
例) declare -a animals=(dog cat monkey bird)

■ declare -p 配列名にて、配列の内容表示可能。
例) declare -p animals
declare -a animals=([0]="dog" [1]="cat" [2]="monkey" [3]="bird")

ちなみに、
declare -ap animals=(・・・) にて配列を宣言することにより、配列宣言と同時に内容表示も可能。


参考文献:
■ 配列のセット

[sed] 各種オプション/スクリプトコマンド

■ 各種オプション
-e sedスクリプトコマンド指定 例) -e "スクリプトコマンド"
-f sedスクリプトファイル読込 例) -f "スクリプトファイル (スクリプトコマンドを記述)"
-n デフォルトの出力抑制
-i ファイルが対象の場合、直接上書き保存

■ スクリプトコマンド
d 該当行のみ削除
p 該当行のみ抽出 ・・・ -n オプションとの組み合わせが必要。
s/before/after/ ・・・ beforeをafterに置換。複数マッチの場合は最初のみ。全て置換する場合は/gオプション指定必要
i 文字列挿入
a 文字列追加
w file ファイルに出力 (複数指定可能)


参考文献:
■ sed に関するメモ
■ sed コマンド

[bash] 動作オプション

■ shopt ・・・ 一覧表示
■ shopt -s "option" ・・・ 有効化
■ shopt -u "option" ・・・ 無効化

[find,sed,xargs mv] ディレクトリ/ファイルの名前一括変更

■ ディレクトリ・ファイルの名前一括変更をするには、sedスクリプトとxargsコマンドを用いれば可能。

find ./ -type d or f | sed 'p;s/before/after/' | xargs -n 2 mv
→ find ./ -type d or f にて、対象ディレクトリ名またはファイル名を標準出力に1行1つずつ表示
→ | sed 'p;' にて、置換前対象ディレクトリ名/ファイル名自体を標準出力に "一旦" 表示
→ | sed 's/before/after/' にて、置換後ディレクトリ名またはファイル名を標準出力に表示
  → この時点で、置換前/後対象ディレクトリ名/ファイル名を標準出力に "1行毎交互" に表示 (★)
これを xargs コマンドに流し込むが、
→ | xargs -n 2 として、置換前 置換後、置換前 置換後、・・・ という区切り方にし、(★)
  これを mv コマンドに与える。
⇒ sed 'p;' にて1行毎交互、xargs -n 2 にて置換前 置換後
  という区切り方を構築するのがポイント。


参考文献:
■ Sed でファイル名と内容を一括置換

[getopts] bash シェルビルトイン関数によるオプション及び引数処理

■ bash シェルビルトイン関数 getopts により、オプション/オプション引数、及び、引数処理が可能。
  → getopts 関数を1度呼び出すのみでは、1つのオプション/オプション引数しか処理出来ない為、
    複数オプション/オプション引数処理の為には、while ループとcase 構文を組み合わせることが必要。
尚、
  → オプションは引数よりも前に配置する必要がある。
  → オプション表記は1文字にしか対応していない。(ロングオプション非対応)


参考文献:
■ bash のシェルスクリプト(関数)でオプション引数を扱う getopts 使い方サンプル
■ bash: コマンドライン引数のオプション解析(getopts)
■ bash によるオプション解析

[sed] 操作対象文字列/操作対象ファイルに対する複数一括操作

■ -e オプション (sedスクリプト) を複数連結することにより、複数一括操作が可能。
例) sed -e "sedスクリプト1" -e "sedスクリプト2" ・・・ "操作対象文字列"
例) sed -i -e "sedスクリプト1" -e "sedスクリプト2" ・・・ "操作対象ファイル"

■ -f オプション (sedスクリプトファイル読込) により、複数一括操作が可能。
例) sed -f "sedスクリプトファイル (置換リスト)" "操作対象文字列"
例) sed -i -f "sedスクリプトファイル (置換リスト)" "操作対象ファイル"
  置換対象ファイル (target_file.txt):
  abcde
  fghij
  klmno
  pqrst
  uvwxy
  z

  sedスクリプトファイル; 置換リスト (replaces.sed):
  s/c/-/
  s/o/-/
  s/hij/---/

  sed -i.bak -f replaces.sed target_file.txt
  ab-de
  fg---
  klmn-
  pqrst
  uvwxy
  z


参考文献:
■ Unix :: コマンド / sed
■ スクリプト言語sed、awk

[sed] ファイル編集後のファイル保存 (上書き/バックアップ可)

sed では標準入力またはファイル入力による文字列に対して編集を行い、標準出力に結果を出力する。
さらにその出力結果内容をリダイレクトによりファイル保存することが可能。

操作対象ファイルに対する文字列編集後に、
■ 別名ファイルへリダイレクトする分には何も問題は起きない。
例) sed -e "s/before/after/g" target_file > destination_file

■ 同一ファイルへリダイレクト (上書き保存の為) する事は出来ない。
  操作対象ファイル自身が結果的に空ファイルとなる。
  → インライン編集 -i オプション (-i.bak にてバックアップ可) を指定することが必須。
    → もしも操作対象ファイルと同一名ファイルにリダイレクト (上書き) すれば、
      コマンド実行よりも前にリダイレクト処理が成され (この瞬間に対象ファイルと同一名ファイル、
      すなわち操作対象ファイル自身が空ファイルと成り)、
      空となった操作対象ファイルに対して、引き続きコマンドが実行される為、
      空ファイルに対しては何も起こらずコマンドが完了 (標準出力に対する結果出力内容は空) し、
      結果的に空の内容がリダイレクトによりファイル保存される。
      (つまり、操作対象ファイルが空ファイルとなってコマンドが終了)
例)
sed -e "s/before/after/g" target_file > target_file
(×)

(○)
sed -i -e "s/before/after/g" target_file       ・・・ 直接上書き
sed -i.bak -e "s/before/after/g" target_file ・・・ バックアップファイル生成