
hp-uxのコマンドで困っております。
どなたか知恵をお貸しいただけたらと思います。
あるファイルより条件に合致する特定の文字列の置換を行い別のファイルとして保存したいと考えております。
このときに以下のsedのコマンドを利用しているのですが、一部上手くいかなくて難儀しております。
コマンド(※文字列の前後にわかりやすく<>を付けていますが実際には入力しません)
sed "/<文字列(1)>[^0-9]/"s"/<文字列(1)>/<文字列(2)>/"g aaaa.txt > bbbb.txt
コマンドの内容
aaaa.txtの中を検索し文字列(1)かつ文字列(1)のすぐ後ろの文字が数字でない場合(例えばIPアドレスで10.xxx.xxx.1というIPアドレスを置換したい場合に10.xxx.xxx.10や10.xxx.xxx.100を含めないようにする場合です)、文字列(1)を文字列(2)に置換しbbbb.txtに保存する。
(※上記コマンドのみだと条件に合致する文字列のたびにbbbb.txtが上書きされるため一番最後の条件に合致する文字列しか置換されませんので、実際にはコマンドのたびにbbbb.txtをaaaa.txtに上書きコピーするステップを入れています)
この際、困っておりますのが元ファイルaaaa.txtにある各行の文字列が以下の場合に認識がされず置換が行われない点です。
(1)10.xxx.xxx.1<タブ>xxxxxxxxxの場合(※条件に合致する文字列のすぐ後ろにタブ文字が入っている場合)
(2)10.xxx.xxx.1<改行>の場合(※条件に合致する文字列のすぐ後ろが改行となっており同一行にそれ以上文字が存在しない場合)
上記の(1),(2)のような行は置換が行われず、元の値のままとなってしまいます。
これらを解決する方法がありましたらよろしくお願いいたします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
> 10.xxx.xxx.1<タブ>xxxxxxxxxの場合
こちらはタブが[^0-9]にマッチするはずなのですが。
> 10.xxx.xxx.1<改行>
こちらの対策は、「<文字列(1)>のあとが、数字でないか、行末かのどちらかである」ということで
/<文字列(1)>\([^0-9]\|$\)/
でいいはずです。
気になるのは
○ ダブルクオートを使っていること。
$等のsedで使う文字がシェル側で展開されてしまいます。
○ 文字列(1) がIPアドレスになっていること。
もし、そのまま入力していたら、 . が「任意の文字列」を意味するメタ文字と解釈されています。
10.20.1.5[^0-9] で検索したら 10.20.165.3 でもマッチします。
○ 1行に複数あった場合、意図しない置換される可能性がある。
10.xxx.xxx.10 10.xxx.xxx.1
とあって、10.xxx.xxx.1 → 20.xxx.xxx.2 に置換したい場合
/10\.xxx\.xxx\.1[^0-9]/ → この行はマッチする
s/10\.xxx\.xxx\.1/20.xxx.xxx.2/g
→ 10\.xxx\.xxx\.1にマッチする全てを置換
→20.xxx.xxx.20 20.xxx.xxx.2
解決例
s/10\.xxx\.xxx\.1\([^0-9]\|$\)/20.xxx.xxx.2\1/g
グルーピングを使って、直後の文字を記憶→後で\1で参照することで
「文字列(1)+後の文字 → 文字列(2)+後の文字」という置換を行う
○ aaaa.txtを上書きする必要はない。
パイプを使って
sed コマンド1 aaaa.txt | sed コマンド2 | ... | sed コマンドn > bbbb.txt
-eオプションで複数のコマンドが指定できる
sed -e コマンド1 -e コマンド2 ... -e コマンドn aaaa.txt > bbbb.txt
コマンドはセミコロンで区切って複数記述できる。
素に書くとシェルのコマンド区切りと解釈されるので、全体をクオートする等の必要がある。
sed 'コマンド1;コマンド2; ...;コマンドn' aaaa.txt > bbbb.txt
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Excel(エクセル) エクセルで文字列と数字が混在する列に書式設定したい。 3 2022/12/19 09:11
- Excel(エクセル) 【画像あり】A1が●+B1と同じ文字がB列にある+C1と同じ文字がC列にある場合D1に〇を付ける 3 2023/03/09 18:18
- UNIX・Linux sedでの正規化 2 2022/05/10 11:39
- その他(コンピューター・テクノロジー) googleスプレッドシートでカッコ内の文字数をカウントしたい 1 2023/01/17 15:52
- その他(ソフトウェア) 一太郎付属の”全件検索”ツールの不具合 3 2023/07/25 15:03
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
NetBTエラーとbrowserエラーが多発
-
Tera Termでのコマンド流し込み...
-
【Ciscoコマンド】interface As...
-
コマンドの戻り値が「130」
-
NICを2枚差しで、インターネッ...
-
FTPのログイン履歴を取得するに...
-
icaclsの読み方
-
コマンドでネットワーク上の全...
-
centos7で、rshコマンドが使用...
-
Windowsのtelnetの使い方
-
Thunderbird 振り分けされなく...
-
大量のフォルダへのハイパーリ...
-
フォルダのサムネイル画像
-
JP1で月末以外で毎週月曜日のジ...
-
xcopyバッチを管理者として実行...
-
java auto updaterとは何でしょ...
-
撮影後、SDカードに作成される...
-
EXCELのSheetを自動更新できな...
-
フォルダ構造のような仕組みの...
-
ブックマークしたことは、サイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
NetBTエラーとbrowserエラーが多発
-
Tera Termでのコマンド流し込み...
-
ブラウザにIPアドレスを直打ち...
-
NICを2枚差しで、インターネッ...
-
コマンドの戻り値が「130」
-
icaclsの読み方
-
【Ciscoコマンド】interface As...
-
centos7で、rshコマンドが使用...
-
FTPのログイン履歴を取得するに...
-
コマンドでネットワーク上の全...
-
コマンドプロンプトで、コマン...
-
ADでユーザ名と表示名をコマン...
-
Active Directryのグループ内の...
-
Windowsでマシンスペックをテキ...
-
自宅サーバーのDNS更新について
-
ActiveDirectory ユーザ一覧取...
-
hp-uxのsedコマンドについて教...
-
ActiveDirectoryの設定抽出
-
date /t > nulの意味を教えてく...
-
windows7 シンボリックリンク...
おすすめ情報