0812345678910111213141516171819202122232425262728293010

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【 --/--/-- (--) 】 スポンサー広告 | TB(-) | CM(-)

bashで正規表現など使いデータの精査(文字列データその2)

bashで文字列の末尾のスペースを削除する



文字列の末尾にスペースがずっと続いている場合がたまにある。可変長文字列データなのに固定長として出力してしまったなど。末尾のスペースを除く方法は、他の日にも書いた、${param%%pattern}を使うと簡単。パターンマッチに使ってるファイル名展開(GLOB)を拡張させるため、シェルオプションにextglob(拡張ファイル名展開)を設定しないといけないが。


$ FIELD=" A "

$ shopt -s extglob

$ echo "===${FIELD%%+(\ )}==="
=== A===



なんで前後をダブルクオートと===で囲ってるかというと、本当にスペースがあるかどうか見やすくしてるだけ。
同様に${param##+(\ )}を使うと、冒頭のスペースを削除できる。

1文字以上を意味するプラス記号が、正規表現では指定したい文字列の後ろに書くところ、ここでは前に書かないといけないのがわかりにくい。


bashで文字列の前後のスペースを削除する



${param##pattern}と${param%%pattern}で冒頭と末尾のスペースを削除する方法。
Param部分は変数しか指定できないので、入れ子に書けないから不便。

$ shopt -s extglob

$ tmp=${FIELD%%+(\ )} #末尾のスペースを削除

$ echo "===${tmp##+(\ )}===" #冒頭のスペースを削除
===A===



もっと簡単な裏技的方法。単純にecho -n。Bashではechoもシェルのビルトイン機能なので別プロセス呼び出しのオーバーヘッドが発生しない。

$ echo "===${FIELD}==="
=== A ===

$ echo -n ${FIELD}
A

$ echo -n ${FIELD} | wc -c
1




クォートされた文字列からクォートを外す



文字列フィールドをシングルクォート(’)やダブルクォート(")で囲ってることはよくある話。
ローダーに渡す分には(恐らく)ローダーの方で勝手に外してくれるから問題ないけど、シェルスクリプトの中で文字数を確認したり値を使いたい場合があるかもしれない。

例えばクォート文字をQUOTE、クォートをエスケープする文字をQUOTE_ESC変数で持ってるとして、

$ echo ${QUOTED_STRING}
'This isn''t mom''s.'

$ QUOTE="'"

$ QUOTE_ESC="'"

$ TMP=${QUOTED_STRING//${QUOTE_ESC}${QUOTE}/${QUOTE}} #エスケープされたクォートをクォート文字単体に戻す

$ echo ${TMP}
'This isn't mom's.'

$ [[ ${TMP} =~ ^${QUOTE}.*[^${QUOTE}]$ ]] && DATA_ERROR_FLG=1 #クォートが閉じてないかチェック

$ [[ ${TMP} =~ ^[^${QUOTE}].*${QUOTE}$ ]] && DATA_ERROR_FLG=1 #クォートで始まってないのに閉じてないかチェック

$ TMP=${TMP#${QUOTE}} #冒頭のクォートを外す

$ UNQUOTED_STRING=${TMP%${QUOTE}} #末尾のクォートを外す

$ echo ${UNQUOTED_STRING}
This isn't mom's.





・参考リンク
Bash 変数の基礎と小技集-- Stray Penguin -Linux Memo-
Man page of Bash--JM Project
スポンサーサイト
【 2014/03/02 (Sun) 】 OS Linuxコマンド(編集用) | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

Ed U Song

Author:Ed U Song
社内ノマドなエンジニア。
仕事で触れる機会のないものを自宅環境作って実験。

スポンサーリンク
最新コメント
最新トラックバック
検索フォーム


                                         
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。