📢 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]]