- ベストアンサー
UNIXでのプログラム
UNIXでのシャルスクリプトでもAWKでもいいのですが以下のようなことがやりたいのですが、いい方法が思い つきません。どなたか教えて下さい。 テキストファイルがあり、そのファイル中の”//”という文字から行末までは削除したファイルを作りたい。 ”//”という文字列は文字列の途中にあるケースも前後にスペースが存在して単語として存在しているケースもあります。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
sed -e /^\\/\\//d -e "s/\\/\\/.*$//" foo.cpp /^\/\//d 行の先頭が//の行を削除 s/\/\/.*$// //から行末までを削除(何も無しに置換) シェルのコマンドラインにいれる場合は\を\\にする必要がありますから、最初の行の通りになります。 更に空白行を削除したければ /^[ \t].*$/d 空白とタブだけからなる行か空の行を削除 行頭が空白類の場合の//も削除したいなら /^[ \t].*\/\//d 等を-eと共に追加して下さい。
その他の回答 (5)
- nightowl
- ベストアンサー率44% (490/1101)
こんにちは。 皆さんのお答えはそれでいいと思います。補足をお読みして思ったのですが、 >実際に実行させようとすると > >/^: Event not found > >なるエラーではしりません。 もしかしてお使いのシェルがCシェル系(csh, tcsh)なのではありませんか? コマンドにCシェルのイベント指定子(!)が含まれる時の典型的症状に見えたので。 複雑な sed, awk コマンド、特に「!」やシングル、ダブルクォーテーションが 交錯するものをワンライナー(コマンドラインから1行)で書くときは、 Bシェル系シェル(sh, bash など)の上で走らせる方が無難です。 以上ただの補足です、失礼しました。
- 3rd
- ベストアンサー率30% (7/23)
No.2 です。 補足を読みましたので再登場。 // で始まる行は、出力させないとのことですので、 No.1 さんのを拡張して、 awk -F// '!/^\/\// {print $1}' <filename> でどうでしょう? // の前に、半角スペースのみがある場合も、となると、 awk -F// '!/^ +\/\// {print $1}' <filename> でいいかも。
- kaha
- ベストアンサー率23% (41/177)
わたしも一言。補足を読む限り、No.1 さんの答えで OK だと思います。 //のある行、//のない行もとちらも出力していますよ。(No1さんの「回答に対する補足」のとおりに。)
- 3rd
- ベストアンサー率30% (7/23)
補足を読む限り、No.1 さんの答えで OK だと思います。 というか完璧。 どこか実行結果に気に入らないところがあったのでしょうか? その場合は、さらに具体的に補足していただけると いいかと思います。
補足
すいません。私が少し勘違いをしていました。 確かに、”ma_asami”さんの回答でほぼ完璧でした。 ここでほぼと言ったのはこのやり方で、問題があるといるわけではないのですが、”//”ではじまる行は空白行が 出力されて今ためしているファイルでは空白行が大量に出力されていたので、私は”//”のない行でうまくいっていないのだと勘違いしていました。できれば、”//"ではじまる行は何も出力しないでそれ以外は今回の回答と同等の動きをしてくれればありがたいのですが.. とえりあえずは勘違い申し訳ありません。 更なるご協力をいただけると助かります。
- ma_asami
- ベストアンサー率34% (11/32)
すみません、「”//”という文字列は文字列の途中にあるケースも前後にスペースが存在して単語として存在しているケースもあります」という部分がよく分からないのですが、単純に awk -F// '{print $1}' <filename> ではダメでしょうか??
補足
説明不足の点がありました。テキストファイルの各行の中に必ず”//"という文字列があるというわけではないのです。”//”を全く含まない行も多数存在しています。 そして、そういった行はそのまま出力したいのです。 ”//”が文字列の途中にあるケースと前後にスペースがあるケースとは例えば 1行目は”//"なし 2行目は文字列中に"//" 3行目は”//”の前後にスペース という場合の例だと 1行 zzz = uuu or ppp 2行 000///aaa = bbb 3行 ccc= ddd and eee // coment ↓ zzz = uuu or ppp 000 ccc = ddd and eee としたいということです。 もし、両方同時というのが困難であればとりあえず、スペースがあるケースでもいのですが..
補足
何度も何度もお手数かけてスイマセン。 私としても awk -F// ’!/^ +\/\// {print $1}’<filename> で完璧かと思ったのですが、 実際に実行させようとすると /^: Event not found なるエラーではしりません。コマンドとしては問題ないように思うのですが...