ed ラインエディタ (一行ずつしか編集できない) │ │← 正規表現による置換機能 │← 正規表現による検索機能 │← etc.etc. │ ├──────────┐ ┴ │ *breakthrough* │ ┬ │ ↓ ↓ vi スクリーンエディタ grep, sed, ... (画面全体で編集可能) │ ↓ emacs, Vz, VisualStudio, Eclipse, ...
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]... -n, --quiet, --silent suppress automatic printing of pattern space -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) -l N, --line-length=N specify the desired line-wrap length for the `l" command --posix disable all GNU extensions. -r, --regexp-extended use extended regular expressions in the script. -s, --separate consider files as separate rather than as a single continuous long stream. -b, --binary do not convert DOS to UNIX lineendings (only on systems supporting different lineendings). -u, --unbuffered load minimal amounts of data from the input files and flush the output buffers more often --help display this help and exit --version output version information and exit
>cat sedExam.txt # Constitution Class L02 L03 USS Constellation NCC-1017 L04 USS Constitution NCC-1700 L05 USS Defiant NCC-1764 L06 USS Eagle NCC-956 L07 USS Endeavor NCC-1895 L08 USS Enterprise NCC-1701 L09 USS Enterprise NCC-1701-A L10 USS Essex NCC-1697 L11 USS Excalibur NCC-1664 L12 USS Exeter NCC-1672 L13 USS Farragut NCC-1647 L14 USS Hood NCC-1703 L15 USS Intrepid NCC-1831 L16 USS Kongo NCC-1710 L17 USS Lexington NCC-1709 L18 USS Potemkin NCC-1657 L19 USS Republic NCC-1371 L20 USS Yorktown NCC-1717
特定の行に対して sedスクリプト("d"=削除)を適用する。
この場合 1行目 のみが適用対象。
>sed -e "1d" sedExam.txt L02 L03 USS Constellation NCC-1017 L04 USS Constitution NCC-1700 L05 USS Defiant NCC-1764 L06 USS Eagle NCC-956 L07 USS Endeavor NCC-1895 L08 USS Enterprise NCC-1701 L09 USS Enterprise NCC-1701-A L10 USS Essex NCC-1697 L11 USS Excalibur NCC-1664 L12 USS Exeter NCC-1672 L13 USS Farragut NCC-1647 L14 USS Hood NCC-1703 L15 USS Intrepid NCC-1831 L16 USS Kongo NCC-1710 L17 USS Lexington NCC-1709 L18 USS Potemkin NCC-1657 L19 USS Republic NCC-1371 L20 USS Yorktown NCC-1717
特定の範囲に対して sedスクリプト("d"=削除)を適用する。
この場合 1行目から10行目 のみが適用対象。
>sed -e "1,10d" sedExam.txt L11 USS Excalibur NCC-1664 L12 USS Exeter NCC-1672 L13 USS Farragut NCC-1647 L14 USS Hood NCC-1703 L15 USS Intrepid NCC-1831 L16 USS Kongo NCC-1710 L17 USS Lexington NCC-1709 L18 USS Potemkin NCC-1657 L19 USS Republic NCC-1371 L20 USS Yorktown NCC-1717
正規表現に合致する範囲に対して sedスクリプト("d"=削除)を適用する。
この場合 # から始まる行のみが適用対象。
>sed -e "/^#/d" sedExam.txt L02 L03 USS Constellation NCC-1017 L04 USS Constitution NCC-1700 L05 USS Defiant NCC-1764 L06 USS Eagle NCC-956 L07 USS Endeavor NCC-1895 L08 USS Enterprise NCC-1701 L09 USS Enterprise NCC-1701-A L10 USS Essex NCC-1697 L11 USS Excalibur NCC-1664 L12 USS Exeter NCC-1672 L13 USS Farragut NCC-1647 L14 USS Hood NCC-1703 L15 USS Intrepid NCC-1831 L16 USS Kongo NCC-1710 L17 USS Lexington NCC-1709 L18 USS Potemkin NCC-1657 L19 USS Republic NCC-1371 L20 USS Yorktown NCC-1717
sedスクリプトの "p" は、選択領域のみ表示する。
"-n"をつけないと、sed のパターン・スペース(正規表現処理のためのメモリ領域)に入った行が全て表示されてしまうので、pスクリプト を使うときには "-n" を指定する必要がある。
>sed -n -e "/E.*e/p" sedExam.txt L06 USS Eagle NCC-956 L07 USS Endeavor NCC-1895 L08 USS Enterprise NCC-1701 L09 USS Enterprise NCC-1701-A L10 USS Essex NCC-1697 L12 USS Exeter NCC-1672
E.* が出現する行から、H.* が出現する行までを対象とするようにするには、次のように
/${正規表現}/,/${正規表現}/${sedスクリプト}/
とする。
>sed -n -e "/E.*/,/H.*/p" sedExam.txt L06 USS Eagle NCC-956 L07 USS Endeavor NCC-1895 L08 USS Enterprise NCC-1701 L09 USS Enterprise NCC-1701-A L10 USS Essex NCC-1697 L11 USS Excalibur NCC-1664 L12 USS Exeter NCC-1672 L13 USS Farragut NCC-1647 L14 USS Hood NCC-1703
17行目について、"L17" は "行17" に変換されますが、"Lexington" は "行exintgton" には変換されません。
>sed -e "s/L/行/" sedExam.txt # Constitution Class 行02 行03 USS Constellation NCC-1017 行04 USS Constitution NCC-1700 行05 USS Defiant NCC-1764 行06 USS Eagle NCC-956 行07 USS Endeavor NCC-1895 行08 USS Enterprise NCC-1701 行09 USS Enterprise NCC-1701-A 行10 USS Essex NCC-1697 行11 USS Excalibur NCC-1664 行12 USS Exeter NCC-1672 行13 USS Farragut NCC-1647 行14 USS Hood NCC-1703 行15 USS Intrepid NCC-1831 行16 USS Kongo NCC-1710 行17 USS Lexington NCC-1709 <-- ! 行18 USS Potemkin NCC-1657 行19 USS Republic NCC-1371 行20 USS Yorktown NCC-1717
17行目の全ての"L"が"行"に変換されました。
>sed -e "s/L/行/g" sedExam.txt # Constitution Class 行02 行03 USS Constellation NCC-1017 行04 USS Constitution NCC-1700 行05 USS Defiant NCC-1764 行06 USS Eagle NCC-956 行07 USS Endeavor NCC-1895 行08 USS Enterprise NCC-1701 行09 USS Enterprise NCC-1701-A 行10 USS Essex NCC-1697 行11 USS Excalibur NCC-1664 行12 USS Exeter NCC-1672 行13 USS Farragut NCC-1647 行14 USS Hood NCC-1703 行15 USS Intrepid NCC-1831 行16 USS Kongo NCC-1710 行17 USS 行exington NCC-1709 <-- ! 行18 USS Potemkin NCC-1657 行19 USS Republic NCC-1371 行20 USS Yorktown NCC-1717
>sed -e "5,10s/USS/HMS/" sedExam.txt # Constitution Class L02 L03 USS Constellation NCC-1017 L04 USS Constitution NCC-1700 L05 HMS Defiant NCC-1764 L06 HMS Eagle NCC-956 L07 HMS Endeavor NCC-1895 L08 HMS Enterprise NCC-1701 L09 HMS Enterprise NCC-1701-A L10 HMS Essex NCC-1697 L11 USS Excalibur NCC-1664 L12 USS Exeter NCC-1672 L13 USS Farragut NCC-1647 L14 USS Hood NCC-1703 L15 USS Intrepid NCC-1831 L16 USS Kongo NCC-1710 L17 USS Lexington NCC-1709 L18 USS Potemkin NCC-1657 L19 USS Republic NCC-1371 L20 USS Yorktown NCC-1717
区切り文字を任意の文字に変更できます。正規表現中では、"/" は "\/" と表現します
>echo 2013/03/15 | sed -e "s:\/:-:g" 2013-03-15 >echo "/bin/mysql" | sed -e "s:\/bin\/mysql:\/usr\/local\/mysql\/bin:g" "/usr/local/mysql/bin"
置換後の文字列の後ろに"&"を入れると、合致する箇所の前方への挿入になります
>sed -e "s/Enterprise/@&/" sedExam.txt # Constitution Class L02 L03 USS Constellation NCC-1017 L04 USS Constitution NCC-1700 L05 USS Defiant NCC-1764 L06 USS Eagle NCC-956 L07 USS Endeavor NCC-1895 L08 USS @Enterprise NCC-1701 L09 USS @Enterprise NCC-1701-A L10 USS Essex NCC-1697 L11 USS Excalibur NCC-1664 L12 USS Exeter NCC-1672 L13 USS Farragut NCC-1647 L14 USS Hood NCC-1703 L15 USS Intrepid NCC-1831 L16 USS Kongo NCC-1710 L17 USS Lexington NCC-1709 L18 USS Potemkin NCC-1657 L19 USS Republic NCC-1371 L20 USS Yorktown NCC-1717
置換後の文字列の前に"&"を入れると、合致する箇所の後方への挿入になります
>sed -e "s/Enterprise/&@/" sedExam.txt # Constitution Class L02 L03 USS Constellation NCC-1017 L04 USS Constitution NCC-1700 L05 USS Defiant NCC-1764 L06 USS Eagle NCC-956 L07 USS Endeavor NCC-1895 L08 USS Enterprise@ NCC-1701 L09 USS Enterprise@ NCC-1701-A L10 USS Essex NCC-1697 L11 USS Excalibur NCC-1664 L12 USS Exeter NCC-1672 L13 USS Farragut NCC-1647 L14 USS Hood NCC-1703 L15 USS Intrepid NCC-1831 L16 USS Kongo NCC-1710 L17 USS Lexington NCC-1709 L18 USS Potemkin NCC-1657 L19 USS Republic NCC-1371 L20 USS Yorktown NCC-1717
"\(\)" を使うことによって、行を領域に分割できます。
>sed -e "s/\(.*\) \(.*\) \(.*\) \(.*\)/Reg: \4 Name: \3/" sedExam.txt # Constitution Class L02 Reg: NCC-1017 Name: Constellation Reg: NCC-1700 Name: Constitution Reg: NCC-1764 Name: Defiant Reg: NCC-956 Name: Eagle Reg: NCC-1895 Name: Endeavor Reg: NCC-1701 Name: Enterprise Reg: NCC-1701-A Name: Enterprise Reg: NCC-1697 Name: Essex Reg: NCC-1664 Name: Excalibur Reg: NCC-1672 Name: Exeter Reg: NCC-1647 Name: Farragut Reg: NCC-1703 Name: Hood Reg: NCC-1831 Name: Intrepid Reg: NCC-1710 Name: Kongo Reg: NCC-1709 Name: Lexington Reg: NCC-1657 Name: Potemkin Reg: NCC-1371 Name: Republic Reg: NCC-1717 Name: Yorktown
[~]$ echo "となりのきゃくはよくかきくうきゃくだ" | sed -e "s/きゃく/客/g" -e "s/かき/柿/" となりの客はよく柿くう客だ
7,15{ s/USS/HMS/ s/\(NCC-\)\(.*\)/\2号/ }
>sed -f sedScript.sed sedExam.txt # Constitution Class L02 L03 USS Constellation NCC-1017 L04 USS Constitution NCC-1700 L05 USS Defiant NCC-1764 L06 USS Eagle NCC-956 L07 HMS Endeavor 1895号 L08 HMS Enterprise 1701号 L09 HMS Enterprise 1701-A号 L10 HMS Essex 1697号 L11 HMS Excalibur 1664号 L12 HMS Exeter 1672号 L13 HMS Farragut 1647号 L14 HMS Hood 1703号 L15 HMS Intrepid 1831号 L16 USS Kongo NCC-1710 L17 USS Lexington NCC-1709 L18 USS Potemkin NCC-1657 L19 USS Republic NCC-1371 L20 USS Yorktown NCC-1717
PERFORMER=`mediainfo $line | grep "Performer" | awk 'BEGIN{FS="[ ]*:[ ]*"}{print $2}'` RECDATE=`echo $line | sed -e "s/^[^_]*//i" -e "s/[.].*$//i"` MP3=`echo ${PERFORMER}${RECDATE}.mp3 | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh ijklmnopqrstuvwxyz0123456789/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/'` /usr/bin/ffmpeg -y -i $line -acodec libmp3lame -vn -ab 128k /var/video/mp3/${MP3} < /dev/null
$ mediainfo NHK−FM_1205190720.WMA General Complete name : NHK−FM_1205190720.WMA Format : Windows Media File size : 92.1 MiB Duration : 1h 40mn Overall bit rate : 129 Kbps Maximum Overall bit rate : 128 Kbps Track name : NHK−FM_1205190720 Performer : WeekendSunshine OLYMPUS : (Binary) Audio ID : 1 Format : WMA Format version : Version 2 Codec ID : 161 Codec ID/Info : Windows Media Audio Description of the codec : Windows Media Audio V8 - 128 kbps, 44 kHz, stereo Duration : 1h 40mn Bit rate : 128 Kbps Channel(s) : 2 channels Sampling rate : 44.1 KHz Bit depth : 16 bits Stream size : 91.6 MiB (100%)
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230879/