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
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
NetBTエラーとbrowserエラーが多発
-
Tera Termでのコマンド流し込み...
-
icaclsの読み方
-
【Ciscoコマンド】interface As...
-
コマンドの戻り値が「130」
-
コマンドプロンプトで、コマン...
-
RTX 1000のネットボランチDNSの...
-
ブラウザにIPアドレスを直打ち...
-
centos7で、rshコマンドが使用...
-
PowerChuteの実行権限?でしょ...
-
コマンドでネットワーク上の全...
-
JP1のインストールについて
-
date /t > nulの意味を教えてく...
-
ActiveDirectory ユーザ一覧取...
-
Thunderbird 振り分けされなく...
-
エクセルで定期的(30分おき)...
-
撮影後、SDカードに作成される...
-
JP1で月末以外で毎週月曜日のジ...
-
java auto updaterとは何でしょ...
-
ディレクトリ数のみを取得する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Tera Termでのコマンド流し込み...
-
ブラウザにIPアドレスを直打ち...
-
【Ciscoコマンド】interface As...
-
NetBTエラーとbrowserエラーが多発
-
icaclsの読み方
-
コマンドの戻り値が「130」
-
NICを2枚差しで、インターネッ...
-
PowerChuteの実行権限?でしょ...
-
FTPのログイン履歴を取得するに...
-
Active Directryのグループ内の...
-
date /t > nulの意味を教えてく...
-
ADでユーザ名と表示名をコマン...
-
centos7で、rshコマンドが使用...
-
ActiveDirectory ユーザ一覧取...
-
RTX 1000のネットボランチDNSの...
-
net send に代わるmsgコマンド...
-
tracertがすべてtimeoutする
-
svn subversiveでの競合編集に...
-
hp-uxのsedコマンドについて教...
-
コマンドプロンプトで複数端末...
おすすめ情報