はじめての方へ
質問箱
Team
相談箱
編集のすすめ
PukiWiki改造メモ
最近更新100件
最近更新ノート
UNIX
コマンド
便利な技
周辺機器
基礎知識
学生ツール
設定、設定ファイル
会津大学ローカル
会津大学への接続
講義関係
過去物
検索
ツールボックス
新しいページの作成
バックアップの表示
リンク元
最近更新したページ
全ページ
ヘルプ
凍結
アップロード
ページ名の変更
recent(10)
2021-02-19
質問箱/46
2020-10-15
質問箱/45
2019-11-29
質問箱/43
2019-11-14
質問箱/44
2018-04-06
UNIX/設定
2017-07-28
UNIX/設定、設定ファ%
2017-04-17
相談箱
2016-11-14
RecentDeleted
2016-07-31
UNIX/周辺機器/USBストレージ
UNIX/コマンド/変換/bmeps - 画像ファイルを高品質なepsに変換
今日の人気
UNIX/コマンド/変換/mogrify
(16)
UNIX/コマンド/ファイル管理/chmod
(11)
UNIX/コマンド/シェル・シェル組み込み/zsh
(10)
UNIX/設定、設定ファイル/.cshrc
(9)
UNIX/設定、設定ファイル/.rhosts
(8)
UNIX/コマンド/変換/convert
(7)
質問箱/45
(7)
質問箱/46
(7)
施設の略記号一覧
(6)
UNIX/コマンド/クライアント/ncftp
(6)
UNIX/基礎知識/リダイレクト、パイプ
(6)
UNIX/コマンド/シェル・シェル組み込み/exec
(6)
UNIX/コマンド/メール/repl
(5)
UNIX/コマンド/シェル・シェル組み込み/eval
(5)
UNIX/コマンド/テキスト処理/sed
(5)
UNIX/コマンド/ユーザー情報/ypcat
(5)
UNIX/設定、設定ファイル/.screenrc
(5)
UNIX/コマンド/変換/nkf
(4)
UNIX/設定、設定ファイル/.emacs
(4)
UNIX/学生ツール/辞典/pensee
(4)
昨日の人気
UNIX/設定、設定ファイル/.rhosts
(8)
UNIX/コマンド/変換/mogrify
(7)
UNIX/コマンド/シェル・シェル組み込み/eval
(6)
UNIX/コマンド/シェル・シェル組み込み/zsh
(6)
UNIX/コマンド/プロセス管理/kill
(5)
UNIX/設定、設定ファイル/.procmailrc
(5)
質問箱/41
(5)
質問箱/7
(4)
UNIX/コマンド/テキスト処理/join
(4)
UNIX/コマンド/tex/dvipdf
(4)
PukiWiki/1.4/Manual
(4)
UNIX/周辺機器/USBストレージ
(4)
UNIX/学生ツール/エンターテイメント/xatf
(4)
UNIX/コマンド/メール/mail
(4)
UNIX/学生ツール/ネットワーク/zebedee
(4)
UNIX/コマンド/変換/bmeps - 画像ファイルを高品質なepsに変換
(4)
UNIX/コマンド/tex/dvipdfm
(4)
UNIX/コマンド/エディタ/vi
(4)
InterWiki
(4)
UNIX/便利な技/コピーアンドペースト、カットアンドペースト
(3)
最近の人気
UNIX/コマンド/変換/mogrify
(23)
UNIX/設定、設定ファイル/.rhosts
(16)
UNIX/コマンド/シェル・シェル組み込み/zsh
(16)
UNIX/コマンド/ファイル管理/chmod
(13)
UNIX/コマンド/シェル・シェル組み込み/eval
(11)
UNIX/設定、設定ファイル/.cshrc
(11)
UNIX/設定、設定ファイル/.procmailrc
(9)
質問箱/45
(9)
UNIX/コマンド/テキスト処理/join
(8)
UNIX/コマンド/変換/convert
(8)
UNIX/コマンド/プロセス管理/kill
(8)
UNIX/コマンド/メール/mail
(8)
施設の略記号一覧
(8)
質問箱/46
(8)
UNIX/コマンド/ユーザー情報/ypcat
(8)
質問箱/41
(8)
UNIX/コマンド/テキスト処理/sed
(7)
質問箱/7
(7)
UNIX/コマンド/エディタ/vi
(7)
UNIX/基礎知識/リダイレクト、パイプ
(7)
全体の人気
UNIX/コマンド/テキスト処理/sed
(80306)
UNIX/コマンド/テキスト処理/sort
(66494)
UNIX/コマンド/シェル・シェル組み込み/foreach
(65060)
UNIX/コマンド/テキスト処理/join
(59733)
UNIX/コマンド/ファイル管理/touch
(58488)
UNIX/基礎知識/バックグラウンド、フォアグラウンド
(56378)
UNIX/コマンド/ファイル管理/rm
(55567)
UNIX/設定、設定ファイル/.forward
(53482)
UNIX/コマンド/検索/find
(52485)
UNIX/コマンド/テキスト処理/cat
(50711)
UNIX/コマンド/変換/mogrify
(50228)
UNIX/学生ツール/ユーザ検索プログラム/gdoko
(46574)
UNIX/設定、設定ファイル/.Xmodmap
(45675)
UNIX/コマンド/プロセス管理/kill
(45597)
UNIX/コマンド/エディタ/vim
(45015)
UNIX/コマンド/シェル・シェル組み込み/source
(43529)
UNIX/コマンド/クライアント/ncftp
(43469)
UNIX/コマンド/tex/dvipdfm
(40819)
UNIX/設定、設定ファイル/.xinitrc
(40528)
UNIX/コマンド/変換/split
(39621)
total:
84518
t
od
ay:
706
yes
terday:
534
now:
12
本文
ノート
編集
差分
Edit of UNIX/コマンド/テキスト処理/sed
*sed の正規表現 [#j9de6333] sed の s コマンドの構文は, s/[regexp]/[replacement]/[flags] のようになっています。[regexp] には正規表現を使用できます。[[正規表現]] を学んでおきましょう。 文字列置換時に [replacement] でマッチしたパターンを参照したい場合は \[数字] を使用します。 % sed 's/.*\(apple|orange\)/\1/g' この場合 \1 は apple か orange のいずれかになります。 \(\) をもう1つ後ろに追加した場合、そのパターンを参照するには \2 を使用することになります。 \0 はマッチ全体「.*\(apple|orange\)」になります。 [regexp] で前方でマッチしたパターンを参照したいすることもできます。 % sed 's/\(apple|orange\)\1/hogehoge/g' appleapple か orangeorange にマッチしたら置換されます。 sed ではグループ化を意味する () は \(\) のようにエスケープする必要があります。 perl, php などではそのまま () です。emacs は sed 同様 \(\) です。 コマンドラインで実行時には、正規表現の * などがシェルにワイルドカードとして展開されないように、's/[regexp]/[replacement]/[flags]' のようにクォーテーションをつけるくせをつけておくとよいです。
Do not change timestamp
TITLE:sed - Stream EDitor (文字列置換) #navi(UNIX/コマンド) #contentsx *sed [#m992bdd4] sed とは Stream EDitor の略で基本的に文字列置換のために使用するコマンドです(他にもいくつかの機能があります)。 例えば、 % sed 's/ika/tako/' [filename] とすると、[filename] で指定したファイル中の最初に見つかった ika という文字列を tako に変えて、標準出力に出力します。 出力をファイルに保存したい場合は[[リダイレクト]]を利用して、 % sed 's/ika/tako/' [in_file] > [out_file] のようにします。ファイルそのものを書き換えてしまいたい場合は、 % sed -i 's/ika/tako/g' [filename] のように -i オプションを使用します。-i[SUFFIX]、例えば -i.bak のようにすると、[filename].bak のようなバックアップをとっておいてくれます。 標準入力も受け付けるのでパイプからの入力を受けることもできます。 % cat [filename] | sed 's/ika/tako/' その行で最初に見つかったもののみではなく、すべて置換したい場合は、 % sed 's/ika/tako/g' [filename] のように g フラグを使用します。基本的に常につけておいて良いぐらいだと思います。 詳しくは man か [[sed, a stream editor>http://www.geocities.jp/fut_nis/html/sed-ja/sed-Programs.html#sed%20Programs]] が参考になります。 *sed の正規表現 [#j9de6333] sed の s コマンドの構文は, s/[regexp]/[replacement]/[flags] のようになっています。[regexp] には正規表現を使用できます。[[正規表現]] を学んでおきましょう。 文字列置換時に [replacement] でマッチしたパターンを参照したい場合は \[数字] を使用します。 % sed 's/.*\(apple|orange\)/\1/g' この場合 \1 は apple か orange のいずれかになります。 \(\) をもう1つ後ろに追加した場合、そのパターンを参照するには \2 を使用することになります。 \0 はマッチ全体「.*\(apple|orange\)」になります。 [regexp] で前方でマッチしたパターンを参照したいすることもできます。 % sed 's/\(apple|orange\)\1/hogehoge/g' appleapple か orangeorange にマッチしたら置換されます。 sed ではグループ化を意味する () は \(\) のようにエスケープする必要があります。 perl, php などではそのまま () です。emacs は sed 同様 \(\) です。 コマンドラインで実行時には、正規表現の * などがシェルにワイルドカードとして展開されないように、's/[regexp]/[replacement]/[flags]' のようにクォーテーションをつけるくせをつけておくとよいです。 *複数ファイル内の文字列置換 [#jfab1342] 複数ファイル内の文字列置換を行いたい場合は % ls | xargs sed -i.bak 's/[regexp]/[replacement]/g' のように xargs コマンドと併用します。しかし、これだと特に置換対象文字列がない場合でもファイルの変更時間が更新されてしまうので、 % grep -l '[regexp]' *.txt | xargs sed -i.bak 's/[regexp]/[replacement]/g' のようにしたほうが良さそうです。[[grep]] の -l はマッチ行ではなく、マッチ行のあったファイル名を出力するオプションです。 ディレクトリ階層を再帰的に辿って置換したい場合は % grep -rl '[regexp]' *.txt | xargs sed -i.bak 's/[regexp]/[replacement]/g' とするか、より柔軟には、 % find . -name '*.txt' | xargs grep -l '[regexp]' | xargs sed -i.bak 's/[regexp]/[replacement]/g' とします。[[find]] には多くのオプションがあるのできめ細かい制御ができそうです。 *文章単位での置換 [#k55f9699] sed では行ごとに文章を読み込み、行単位で処理をします。 文章全体で文字列置換をしたい場合は、sed では苦しいので、ここでは perl を使用してみます。 % perl -e '$_=join("",<>);s/[regexp]/[replacement]/g;print;' < [filename] 全行読み込み、すべてくっ付けてから文字列置換し、プリントアウトしています。((これは perl -e '$_=join("",<IN>);$_=~s/[regexp]/[replacement]/g;print $_;' < [filename] と同等です。)) 例をあげます。file という名の以下の内容のファイルがあるとします。 <div> This is div. </div> 次のようにすると、文章先頭に HEAD を追加できます。文章全体に対して処理しているので、^ は行頭ではなく文章頭のみにマッチしているわけです。 % perl -e '$_=join("",<>);s/^/HEAD/g;print;' < file HEAD<div> This is div. </div> 次のようにすると、 <div></div> 内部の文字は変えずに <div></div> を <p></p> に変えることができます。 % perl -e '$_=join("",<>);s!<div>([^<>]*)</div>!<p>$1</p>!gs;print;' < file <p> This is div </p> s// の区切り文字を !! にしています。</div> の / を <\/div> のようにエスケープせずにすむようになるので楽です。 !gs の s は . を改行文字にもマッチさせる修飾子です( [^<>]* の部分で改行文字にもマッチするように)。 ''閑話休題:'' perl には、バグというか変な仕様がありまして、 % perl -e '$_=join("",<>);s/$/TAIL/g;print;' < file と $ を使用して文章末を置換しようとすると <div> This is div </div>TAIL TAIL のように2度置換されてしまったりします。 php の perl コンパチブルな正規表現関数 preg_*** では、このおかしな挙動をわざわざ忠実に再現していたりします。[[PHP - パターン修飾子 - m (PCRE_MULTILINE)>http://us.php.net/manual/ja/reference.pcre.pattern.modifiers.php]]。おかしな話ですね。 #navi(UNIX/コマンド,,footer)
ログインまたはアカウント作成