📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の13版が非表示)
19行目: 19行目:
<br>
<br>
また、<code>-f</code>オプションで変換手順を記載したスクリプトファイルを指定できる。その時、指定したファイルの内容に従って処理される。<br>
また、<code>-f</code>オプションで変換手順を記載したスクリプトファイルを指定できる。その時、指定したファイルの内容に従って処理される。<br>
<br><br>
== sedのインストール ==
==== パッケージ管理システムからインストール ====
多くのLinuxディストリビューションでは、最小インストールでsedがインストールされている。<br>
もし、何らかの理由でインストールされていない場合は、パッケージ管理システムからsedインストールすることができる。<br>
sudo zypper install sed
<br>
==== ソースコードからインストール ====
手動でsedをインストールする場合、ソースコードからsedをインストールする。<br>
<br>
[https://ftp.gnu.org/gnu/sed/ GNUソフトウェアの公式Webサイト]にアクセスして、sedのソースコードをダウンロードする。<br>
ダウンロードしたファイルを解凍する。<br>
tar xf sed-<バージョン>.tar.xz
cd sed-<バージョン>
<br>
sedをビルドおよびインストールする。<br>
mkdir build && cd build
../configure --prefix=<sedのインストールディレクトリ>
make -j $(nproc)
make install
<br>
~/.profileファイル等に、環境変数<code>PATH</code>を追記する。<br>
vi ~/.profile
<br>
<syntaxhighlight lang="sh">
# ~/.profileファイル
export PATH="/<sedのインストールディレクトリ>/bin:$PATH"
</syntaxhighlight>
<br><br>
<br><br>


25行目: 56行目:
<br>
<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable" | style="background-color:#fefefe;"
|-
|-
! オプション !! 説明
! style="text-align: center;background-color:#66CCFF;" | オプション  
! style="text-align: center;background-color:#66CCFF;" | 説明
|-
|-
| -e <スクリプト名> || 指定したスクリプト(条件式)で変換処理を行う。
| -e <スクリプト名> || 指定したスクリプト(条件式)で変換処理を行う。
54行目: 86行目:
== sedコマンドの条件式 ==
== sedコマンドの条件式 ==
<center>
<center>
{| class="wikitable"
{| class="wikitable" | style="background-color:#fefefe;"
|-
|-
! 条件式 !! 説明
! style="text-align: center;background-color:#66CCFF;" | 条件式  
! style="text-align: center;background-color:#66CCFF;" | 説明
|-
|-
| 行数 || 処理する行数を指定する
| 行数 || 処理する行数を指定する
115行目: 148行目:
|}
|}
</center>
</center>
<br><br>
== デリミタ ==
sedコマンドには、置換のデリミタ (区切り文字) が複数存在する。<br>
機能的には同じ結果をもたらす。<br>
<br>
デリミタとしては他にも <code>:</code>、<code>@</code>、<code>#</code>などの文字を使用することができる。<br>
<br>
# <code>/</code>を区切り文字として扱う場合
sed -i "s/<lastmod>.*</lastmod>/<lastmod>${current_date}</lastmod>/g" hoge.xml
# <code>|</code>を区切り文字として扱う場合
sed -i "s|<lastmod>.*</lastmod>|<lastmod>${current_date}</lastmod>|g" hoge.xml
<br>
これらの違いが重要になる理由を以下に示す。<br>
* 可読性
*: パスやURLを含む文字列を扱う場合、/を含むことが多いため、|を使用すると読みやすくなることがある。
* エスケープの必要性
*: /をデリミタとして使用する場合、置換対象やパターン内に/が含まれている時、それをエスケープする必要がある。
*: |を使用すると、/をエスケープする必要がない。
<br>
上記では、XMLタグを扱っているため、どちらを使用しても問題ない。<br>
しかし、より複雑なパターンや<u>/ (スラッシュ)</u> を含む文字列を扱う場合は、<u>| (バーティカルバー)</u> を使用する方が便利な場合がある。<br>
<br><br>
<br><br>


== 使用例 ==
== 使用例 ==
テキストファイルの5~10行目を削除する。<br>
テキストファイルの5~10行目を削除する。<br>
  sed -e "5,10d" test.txt  
  sed -i -e "5,10d" test.txt  
<br>
<br>
テキストファイル内の"Nikkei Linux"を"日経Linux"に変換する。<br>
テキストファイル内の"Nikkei Linux"を"日経Linux"に変換する。<br>
  sed -e "s/Nikkei Linux/日経Linux/g" test.txt  
  sed -i -e "s/Nikkei Linux/日経Linux/g" test.txt  
<br>
<br>
"Error"という文字列がある行に対して、"### Check Line ###"という新しい行を追加する。<br>
"Error"という文字列がある行に対して、"### Check Line ###"という新しい行を追加する。<br>
  sed -e "/Error/i #### Check Line ###" test.txt
  sed -i -e "/Error/i #### Check Line ###" test.txt
<br>
複数の命令を1度に実行する。<br>
# "baseball"を"swimming"に置換した後、"rugby"を含む行を削除
sed -i -e 's/baseball/swimming/' -i -e '/rugby/d' test.txt
<br>
複数のファイルを一括置換する。<br>
# 複数のファイル内の“apple”を“orange”に置換
sed -i 's/apple/orange/' test1.txt test2.txt test3.txt
<br><br>
<br><br>


135行目: 199行目:
併せて、<code>grep</code>コマンドと<code>awk</code>コマンドの正規表現も記載する。<br>
併せて、<code>grep</code>コマンドと<code>awk</code>コマンドの正規表現も記載する。<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable" style="background-color:#fefefe;"
|-
|-
! grep !! sed !! awk !! 意味
! style="background-color:#00ffff;" | grep  
! style="background-color:#00ffff;" | sed  
! style="background-color:#00ffff;" | awk  
! style="background-color:#00ffff;" | 意味
|-
|-
| . || . || . || 任意の1文字
| . || . || . || 任意の1文字
164行目: 231行目:
|-
|-
| <nowiki>\|</nowiki> || <nowiki>\|</nowiki> || <nowiki>|</nowiki> || 2 パターンのうちどちら片方
| <nowiki>\|</nowiki> || <nowiki>\|</nowiki> || <nowiki>|</nowiki> || 2 パターンのうちどちら片方
|-
|  || .* ||  ||  空文字("")を含む任意の文字列
|-
|  || [aA0] ||  || aもしくはAもしくは0
|-
|  || [^aA0] ||  || aでもAでも0でもない文字
|-
|  || [a-z] ||  || aからzまでのいずれかの文字
|-
|  || ^$ ||  || 空行
|}
|}
</center>
</center>
275行目: 352行目:
  sed -e 's/パターン//g'  # 置換後の文字列を指定しないことで削除処理になる
  sed -e 's/パターン//g'  # 置換後の文字列を指定しないことで削除処理になる
<br>
<br>
文字列の削除も置換処理と同じなので、通常の置換処理と使い方はまったく同じである。<br>
文字列の削除も置換処理と同じなので、通常の置換処理と使い方は同じである。<br>
  echo "hoge-fuga foo-bar" | sed -e 's/-//'  # gを指定していないため、最初に一致した文字のみ削除される
  echo "hoge-fuga foo-bar" | sed -e 's/-//'  # gを指定していないため、最初に一致した文字のみ削除される
  hogefuga foo-bar
  hogefuga foo-bar
282行目: 359行目:
  hogefuga foobar
  hogefuga foobar
<br><br>
<br><br>
==== 正規表現を使用した文字列置換 ====
置換対象パターンの指定には、一部の正規表現を使用することもできる。<br>
使用可能な正規表現は、sedのバージョン等により異なる場合がある。<br>
<br>
aからeまでのいずれかの文字をXに置換する。<br>
echo "abcdefghij" | sed -e 's/[a-e]/X/g'
XXXXXfghij
<br>
数字以外を削除する。<br>
echo "I am 20 years old." | sed -e 's/[^0-9]//g'
20
<br>
行頭に文字列を追加するには、行頭を表す<code>^</code>(キャレット)を追加する文字列に置換する。<br>
echo "Hello World" | sed -e 's/^/>>>/g'
>>>Hello World
<br>
行末に文字列を追加するには、行末を表す<code>$</code>を追加する文字列に置換する。<br>
echo "Hello World" | sed -e 's/$/ !!!/g'
Hello World !!!
<br>
連続する複数のスペースを1つにまとめる。<br>
連続する複数のスペースは、<code>  *</code>で表される。<br>
<br>
<code>*</code>(アスタリスク)は直前の文字の0〜N個の繰り返しであるため、<code> *</code>では0個のスペースも置換対象とみなされる。<br>
したがって、連続する複数のスペースを表すには、"1個のスペース + 0〜N個のスペース"で<code>  *</code>となる。<br>
echo "hello    world" | sed -e 's/  */ /'
hello world
<br>
GNU sed(Linuxのsed)では、<code> \+</code>で、1個以上の連続するスペースを表現することができる。<br>
echo "hello    world" | sed -e 's/ \+/ /'
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>
sed -e "s/${変数名}/置換後パターン/"
sed -e "s/置換対象パターン/${変数名}/"
sed -e "s/$VAR1/$VAR2/"
<br>
VAR="hoge"
echo "hoge piyo fuga" | sed -e "s/${VAR}/foo/"  # 変数VARの値(hoge)をfooに置換
foo piyo fuga
echo "hoge piyo fuga" | sed -e "s/fuga/$VAR/"  #↑変数VARの値(hoge)が置換パターンに使用される
hoge piyo hoge
<br>
==== 行を指定した置換 ====
sedコマンドは、行番号を指定することにより、限定された範囲内でのみ処理を行うことができる。<br>
# 特定の1行のみで置換を行う
sed -e '<行番号>s/パターン1/パターン2/'
# 開始行~終了行の範囲でのみ置換を行う
# sの直前に対象とする行番号を指定する
sed -e '<開始行>,<終了行>s/パターン1/パターン2/'
<br>
ある特定の行のみを置換対象とする場合、または、N行目〜M行目のみを置換対象とする場合は、<br>
対象とする行の行番号を指定することで、処理が適用される範囲を限定することができる。<br>
<br>
以下の例では、テキストファイルに対して、置換処理を行っている。<br>
cat Sample.txt
111 ABC
222 ABC
333 ABC
<br>
2行目のみを処理対象とする。<br>
sed -e '5s/ABC/OK/' Sample.txt
111 ABC
222 OK
333 ABC
<br>
2~3行目のみを処理対象とする。<br>
sed -e '2,3s/ABC/OK/' Sample.txt
111 ABC
222 OK
333 OK
<br>
==== 特定の行を削除する ====
特定の文字列を含む行を削除するには、<code>d</code>を指定する。<br>
<br>
N行目またはN行目~M行目を削除する場合、削除対象となる行のパターンと<code>d</code>を指定することで、そのパターンを含む行を削除できる。<br>
この処理は、置換ではなく削除であるため、置換後のパターンを指定する必要はない。<br>
sed -e '/パターン/d'
<br>
以下の例では、テキストファイルに対して削除処理を行っている。<br>
cat Sample.txt
111 ABC
222 ABC
333 ABC
<br>
333を含む行を削除する。<br>
sed -e '/333/d' Sample.txt
111 ABC
222 ABC
<br>
上記は、<code>grep -v</code>コマンドでも同様の処理ができる。<br>
grep -v "333" Sample.txt
111 ABC
222 ABC
<br>
空行を削除する。
空行は、行頭と行末の間に何も存在しない行であるため、正規表現の<code>^$</code>で表すことができる。<br>
これを置換対象パターンに指定することで、空行を削除することができる。<br>
cat Sample.txt
111 ABC
222 ABC
<br>
sed -e '/^$/d' Sample.txt
111 ABC
222 ABC
<br>
行中に含まれる置換パターンに関係なくN行目を削除するには、置換パターンを指定せずに<code>d</code>に行番号のみを指定する。<br>
# 単一行の削除
sed -e '<行番号>d'
# 複数行の削除
sed -e '<開始行>,<終了行>d'
<br>
cat Sample.txt
111 ABC
222 ABC
333 ABC
<br>
sed -e '3d' Sample.txt
 
111 ABC
222 ABC
<br>
sed -e '2,3d' Sample.txt
111 ABC
<br>
最下行を削除するには、最下行を表す<code>$</code>を行番号の代わりに指定する。<br>
cat Sample.txt
111 ABC
222 ABC
333 ABC
<br>
sed -e '$d' Sample.txt
111 ABC
222 ABC
<br>
==== 特定の行のみを表示する ====
N行目またはN~M行目のみを表示するには、<code>-n</code>オプション、行番号、<code>p</code>を指定する。<br>
# N行目を表示
sed -n '<行番号>p'
# N行目~M行目を表示
sed -n '<開始行>,<終了行>p'
<br>
1行目のみを表示する。<br>
cat Sample.txt
111 ABC
222 ABC
333 ABC
<br>
1行目のみを表示する。<br>
sed -n '1p' Sample.txt
111 ABC
<br>
2~3行目のみを表示する。<br>
sed -n '2,3p' Sample.txt
111 ABC
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]]