📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| 296行目: | 296行目: | ||
<br><br> | <br><br> | ||
== 正規表現を使用した文字列置換 == | ==== 正規表現を使用した文字列置換 ==== | ||
置換対象パターンの指定には、一部の正規表現を使用することもできる。<br> | 置換対象パターンの指定には、一部の正規表現を使用することもできる。<br> | ||
使用可能な正規表現は、sedのバージョン等により異なる場合がある。<br> | 使用可能な正規表現は、sedのバージョン等により異なる場合がある。<br> | ||
| 327行目: | 327行目: | ||
echo "hello world" | sed -e 's/ \+/ /' | echo "hello world" | sed -e 's/ \+/ /' | ||
hello world | hello world | ||
<br> | |||
==== 特定の位置の文字列を切り出す ==== | |||
例えば、5文字目から10文字目までを切り出す場合や"ABC"の後に続く3文字を切り出す場合等、<br> | |||
特定の条件に一致する部分的な文字列のみを切り出す。<br> | |||
sed -e 's/パターンA\(切り出し対象パターン\)パターンB/\1/' # 文字列を正規表現化して、切り出す部分をエスケープした()で囲む | |||
<br> | |||
全体のパターン(パターンA + 対象パターン + パターンB)に一致した文字列のうち、<br> | |||
()で囲んだ対象パターンに一致する部分を、\1 を使用することで切り出すことができる。<br> | |||
<br> | |||
また、()で囲む部分を増やすことにより切り出す文字列を複数指定でき、1番目の括弧は\1、2番目の括弧は\2といったように、<br> | |||
()の順番に対応した番号を指定して切り出すことができる。<br> | |||
<br> | |||
<u>なお、切り出し対象を指定する括弧は、<code>\( \)</code>のようにエスケープする必要がある。</u><br> | |||
echo "ABC123DEF456" | sed -e 's/...\(...\).*/\1/' # .(ドット)は任意の1文字を表すため、<cooe>...</coe>は任意の3文字を表す | |||
123 | |||
echo "ABC123DEF456" | sed -e 's/...\(...\)...\(...\)/\1 \2/' | |||
123 456 | |||
echo "ABC123DEF456" | sed -e 's/...\(...\)/\1 /' | |||
123 DEF456 | |||
<br> | |||
sedコマンドによる文字列の切り出しは、パターンに一致した文字列を括弧の中の文字列で置換する。<br> | |||
そのため、上記の3つ目の例のように、パターンに一致しなかった部分はそのまま出力される。<br> | |||
<br> | |||
同様に、<code>expr</code>コマンドでも文字列を切り出すことができる。<br> | |||
expr "文字列" : "パターンA\(対象パターン\)パターンB" # 文字列を正規表現化して、切り出す部分をエスケープした()で囲む | |||
<br> | |||
exprコマンドでは1度に複数の部分を切り出すことはできない。(切り出されるのは最初の括弧の部分のみ)<br> | |||
sedコマンドと同様に、括弧はエスケープする必要がある。<br> | |||
ただし、sedコマンドとは異なり、パターンに一致しなかった部分は出力されない。<br> | |||
expr "ABC123DEF456" : "...\(...\)" # パターンに一致しない部分DEF456は出力されない | |||
123 | |||
expr "ABC123DEF456" : "...\(...\)...\(...\)" # 1度に複数の部分を切り出すことはできない | |||
123 | |||
<br> | |||
==== 制御文字を削除する ==== | |||
Windows上でテキストファイルを作成して、改行コードをLFに変換せずにCR + LFのままLinuxへ転送するといったミスがよくある。<br> | |||
この時、転送されたファイルをLinux上でvi等を使用して開くと、行末に^Mが表示されていることがある。<br> | |||
<br> | |||
制御文字をsedコマンドで削除する場合、制御文字を指定することは少し煩雑である。<br> | |||
削除対象となる制御文字は、sedコマンドに^M等と直接入力しても削除することができない。<br> | |||
<br> | |||
例えば、制御文字である^Mを入力するには、 [Ctrl] + [V]、[Ctrl] + [M]と連続して入力する。<br> | |||
<br> | |||
以下の例では、削除対象となる制御文字の^Mが含まれたテキストファイルをviで開いている。<br> | |||
hoge、piyo、fugaは通常の文字列、行末の^Mが削除対象となる制御文字となっている。<br> | |||
vi CRLF.txt | |||
hoge ^M | |||
piyo ^M | |||
fuga ^M | |||
<br> | |||
sedコマンドの置換対象の文字列の入力において、[Ctrl] + [V]、[Ctrl] + [M]と入力する。<br> | |||
sed -e 's/^M//g' CRLF.txt > LF.txt # "^"は制御文字であるため、エスケープは不要 | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]] | [[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]] | ||