2021.03.11  

【Linux】sedで改行を置換し、文字列にする

Linux    

sedで改行を置換し、文字列にする方法を紹介します。

結論
最初の一行だけ置換するなら

sed -z "s/\n/置換したい文字列/"

全行置換するなら最後にgをつける

sed -z "s/\n/置換したい文字列/g"

オプション解説
-z :通常文字列を改行で分割するところを、NULLで行を分割するオプション。

実例
こんなテキストを用意します。

$ cat list.txt
Tom_
_Jon_
_Hoge_

最初の行の改行コードを文字列「and」に置換するパターン。

$ cat list.txt | sed -z "s/\n/and/"
Tom_and_Jon_
_Hoge_

次は全ての行の改行コードを文字列「and」に置換するパターン。

$ cat list.txt | sed -z "s/\n/and/g"
Tom_and_Jon_and_Hogeand_and$ 

上記では末尾まで改行が消えてしまう($が末尾についてしまう)のと、
さらにandも末尾についてしまうのがイケていない。
次のように書くとすっきり出力される。

$ cat list.txt | sed -z "s/\n/and/g" | sed "s/and$/\n/g"
Tom_and_Jon_and_Hoge_

【応用編】ip a の結果をインターフェースごとに一行にまとめたい

普通に ip a コマンドを実行すると次のようになる。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:86:08:23 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute eth0
       valid_lft 73270sec preferred_lft 73270sec
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:af:6f:bd brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.21/24 brd 192.168.33.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:feaf:6fbd/64 scope link 
       valid_lft forever preferred_lft forever

この結果を、行頭から項番を消したうえで、インターフェースごとに一行にまとめてみる。
次のコマンドで実現可能。

$ ip a | sed -z "s/\n/TmpString/g" | sed "s/TmpString[0-9]: /\n/g" | sed "s/^1: //g" | sed -z "s/TmpString$/\n/g"

実行例

 $ ip a | sed -z "s/\n/TmpString/g" | sed "s/TmpString[0-9]: /\n/g" | sed "s/^1: //g" | sed -z "s/TmpString$/\n/g"
lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000TmpString    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00TmpString    inet 127.0.0.1/8 scope host loTmpString       valid_lft forever preferred_lft forever
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000TmpString    link/ether 08:00:27:86:08:23 brd ff:ff:ff:ff:ff:ffTmpString    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute eth0TmpString       valid_lft 72935sec preferred_lft 72935sec
eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000TmpString    link/ether 08:00:27:af:6f:bd brd ff:ff:ff:ff:ff:ffTmpString    inet 192.168.33.21/24 brd 192.168.33.255 scope global noprefixroute eth1TmpString       valid_lft forever preferred_lft foreverTmpString    inet6 fe80::a00:27ff:feaf:6fbd/64 scope link TmpString       valid_lft forever preferred_lft forever

参考
https://www.atmarkit.co.jp/ait/articles/1610/17/news015.html

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信