タグ付けされた質問 「sed」

sedは、テキストをフィルタリングおよび変換するためのコマンドラインストリームエディターです。

1
POSIX sedは、アドレス範囲が既に削除された行から始まる `1d; 1,2d`に何を必要としますか?
この質問へのコメントで、さまざまなsed実装がかなり単純なプログラムで同意しない場合があり、私たち(または少なくとも私)は、仕様が実際にそれに対して必要とするものを決定できませんでした。 問題は、削除された行から始まる範囲の動作です: 1d;1,2d そのコマンドに到達する前に範囲の開始が削除された場合でも、行2を削除する必要がありますか?私の当初の期待はBSD sedに沿って「いいえ」でしたが、GNU sedは「はい」と言っており、仕様テキストをチェックしても問題は完全には解決しません。 私の予想に一致するのは、(少なくとも)macOSとSolaris sed、およびBSD sedです。反対は(少なくとも)GNUとBusybox sedであり、多くの人々がここにいます。最初の2つはSUS認定で、他の2つはより普及している可能性があります。どの動作が正しいですか? 2アドレス範囲の仕様書には次のように記載されています。 sedのコマンドは、次のサイクルが終了しますかを開始するまでのユーティリティはその後、順番にそのアドレスがそのパターンスペースを選択するすべてのコマンドを適用しなければなりません。 そして 2つのアドレスを持つ編集コマンドは、最初のアドレスに一致する最初のパターンスペースから2番目のアドレスに一致する次のパターンスペースまでの包括的な範囲を選択します。[...]選択した範囲に続く最初の行から開始して、sedは最初のアドレスを再度探します。その後、プロセスが繰り返されます。 おそらく、ライン2がある 範囲内にかかわらず開始点が削除されたかどうかの、「第二に一致する次のパターン空間を介して第1のアドレスと一致する第1のパターン領域からの包含範囲」。一方、私は最初dが次のサイクルに移動し、範囲に開始する機会を与えないことを期待していました。UNIX™認定の実装は、私が期待したことを実行しますが、仕様で要求されていることを潜在的に実行しません。 いくつかの実例となる実験が続きますが、重要な問題は、削除された行で範囲が始まるときに何をすべき sedかです。 実験と例 問題の簡単なデモンストレーションはこれです。これは、行を削除するのではなく、余分なコピーを印刷します。 printf 'a\nb\n' | sed -e '1d;1,2p' これは、提供するsed入力の2行、aおよびb。プログラムは2つのことを行います。 で最初の行を削除し1dます。dコマンド意志 パターンスペースを削除し、次のサイクルを開始します。そして 各行が受け取る自動印刷に加えて、1から2までの行の範囲を選択して明示的に印刷します。したがって、範囲に含まれる行は2回表示されます。 私の期待は、これが印刷されることでした b ただ、1,21行目で到達できないため(d次のサイクル/行に既にジャンプしているため)範囲aが適用されず、範囲の包含は決して開始されず、削除されます。SolarisおよびBSDの一般的なsed非POSIXと同様に、macOSおよびSolaris 10 の準拠するUnixがこの出力を生成します。sedsed 一方、GNU sedは印刷します b b 範囲を解釈したことを示します。これはPOSIXモードでもそうでない場合でも発生します。Busyboxのsedは同じ動作をします(ただし、常に同じ動作とは限らないため、共有コードの結果ではないようです)。 さらなる実験 printf 'a\nb\nc\nd\ne\n' | sed -e '2d;2,/c/p' printf 'a\nb\nc\nd\ne\n' | …
11 sed  posix 

2
区切り文字の前にn文字がないすべての行を削除します
私は非常に長いテキストファイル(ここから)を作成し、6つの16進文字と「改行」(1つの文字として表示され、以下のコードマークダウンに適切に表示されないようです)とそれに続くいくつかの単語を含める必要があります。 00107B Cisco Systems, Inc 00906D Cisco Systems, Inc 0090BF Cisco Systems, Inc 5080 Cisco Systems, Inc 0E+00 ASUSTek COMPUTER INC. 000C6E ASUSTek COMPUTER INC. 001BFC ASUSTek COMPUTER INC. 001E8C ASUSTek COMPUTER INC. 0015F2 ASUSTek COMPUTER INC. 2354 ASUSTek COMPUTER INC. 001FC6 ASUSTek COMPUTER INC. 60182E ShenZhen Protruly Electronic Ltd …


7
間違った場所で壊れた行を修正するにはどうすればよいですか?
私のテキストファイルは次のようになります。 This is one sentence that is broken. However this is a good one. And this one is somehow, broken into many. 小文字で始まる行が続く行の末尾の改行文字を削除したい。 したがって、これは次のようになります。 This is one sentence that is broken. However this is a good one. And this one is somehow, broken into many. これどうやってするの? 編集:ここには本当に良い答えがいくつかありますが、私は最初に機能し、最も早いものを受け入れることにしました。どうもありがとうございました!

5
Solarisの「sed -i」コマンドに代わるものはありますか?
私のプロジェクトでは、ファイル内の既存のテキストをfoo次のような他のテキストに置き換える必要がありますfooofoo。 abc.txt name foo foo1 だから私は試しました: sed -i "s/foo/fooofoo/g" abc.txt しかし、私はこのエラーを受け取ります: sed:不正なオプション- i 私は使用しなければならないことをマニュアルで見つけました: sed -i\ "s/foo/fooofoo/g" abc.txt ただし、これも機能しません。 私は中の選択肢を発見したperlとawkもなく、Solarisの溶液をsedはるかに高く評価されるだろう。 私はこのバージョンのbashを使用しています: GNU bash、バージョン3.2.57(1)-release(sparc-sun-solaris2.10)

2
ファイル内の各文字の(数値)ASCII値を出力するにはどうすればよいですか?
各文字のASCII数値をテキストファイルに出力する方法を教えてください。と同様catですが、ASCII値のみを表示しています...(16進数または10進数で問題ありません)。 Apple(改行付き)という単語を含むファイルの出力例は次のようになります。 065 112 112 108 101 013 004
11 linux  bash  sed  awk  terminal 

8
ファイルシステム全体でのsedインプレース行削除?
まだ診断されていないアプリケーションのバグが原因で、ディスクがいっぱいのサーバーが数百台あります。重複する行で満たされたファイルが1つあります。ログファイルではなく、変数定義を含むユーザー環境ファイルです(そのため、ファイルを削除することはできません)。 sed誤って追加された行をチェックして削除する簡単なコマンドを書き、ファイルのローカルコピーでテストしました。意図したとおりに機能しました。 ただし、ディスク全体を使用してサーバーで試したところ、およそ次のエラーが発生しました(コピーと貼り付けではなく、メモリからのものです)。 sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname もちろん、私が知っている、左にスペースはありません。だから私はものを削除しようとしています!(sed私が使用しているコマンドは、4000行以上のファイルを約90行に減らします。) 私のsed命令はただsed -i '/myregex/d' /path/to/file/filename ディスクがいっぱいでもこのコマンドを適用する方法はありますか? (クイックフィックスとして数百のサーバーに適用する必要があるため、自動化する必要があります。) (明らかにアプリケーションのバグを診断する必要がありますが、その間サーバーは正しく動作していません...) 更新:私が直面した状況は、自分が削除できることがわかった他のものを削除することで解決しましたが、この質問への回答は今後も他の人にも役立つと思います。 /tmp立ち入り禁止です。同じファイルシステム上にあります。 ディスク領域を解放する前にvi、ファイルを開いて実行することで行を削除できることをテストして確認し:g/myregex/d、変更をで正常に保存しました:wq。一時ファイルを保持するために別のファイルシステムに頼ることなく、これを自動化することは可能であると思われます...(?)

6
別のファイルで見つかった行に応じてファイルから行を削除する
ファイルfile1.txtには、次のような行が含まれています。 /api/purchase/<hash>/index.html 例えば: /api/purchase/12ab09f46/index.html ファイルfile2.csvには、次のような行が含まれています。 <hash>,timestamp,ip_address 例えば: 12ab09f46,20150812235200,22.231.113.64 a77b3ff22,20150812235959,194.66.82.11 file2.csvをフィルタリングして、file1.txtにもハッシュの値が存在するすべての行を削除します。それは言うことです: cat file1.txt | extract <hash> | sed '/<hash>/d' file2.csv またはこのようなもの。 簡単なはずですが、うまく動かないようです。 誰もがこのタスクのための作業パイプラインを提供できますか?

2
Sedは行からすべての開始パターン一致を削除します
次の行があります。 abababtestab 変換された行が次のようになるように、行の先頭からのsedすべての出現を削除する式を理解しようとしていabます: testab これは簡単なはずですが、本当に何も知りませんsed。 これまでのところ: sed 's/^ab//' しかし、これはabの最初の出現を削除するだけです。
11 sed 

2
大きなCSVファイルのインデックスを再作成する
私はこの役立つスレッドで回答を調べましたが、私の問題は十分に異なっているようです(少なくともでsed)。 次のような行を含む大きなCSVファイル(200 GB以上)があります。 <alphanumerical_identifier>,<number> どこ<alphanumerical_identifier>ファイル全体にわたって一意です。最初の列をインデックスで置き換える別のファイルを作成したい、つまり <index>,<number> 私たちが得るように: 1, <number> 2, <number> 3, <number> awkメモリ内のファイル全体を読み込まなくても、増加するインデックスを生成できますか? インデックスは単調に増加するため、単にインデックスを削除する方が良い場合があります。そのための解決策はそれとは異なりますか?すなわち: <number> <number> <number>
11 files  sed  awk  csv 

2
ファイルで「\ r \ n」を「\ n」に置き換える最も高速で最もコアな方法は?
私trはよりコアな方法であると思います、それゆえおそらく与えられたファイル内のものを置き換えるより速い方法でしょう。 ただし、trは等しい量の文字のみを置き換えることができます。意味... 2文字は2文字でのみ置換できます。つまり、置換を意味します \r\nと\nは問題外ですtr 次善の選択肢はsed何ですか? trに機能がないことを考える\r\nと\n、sedはファイルで置き換える最もコアで最速の方法ですか? 可能な場合は例を示します。
11 sed  replace  tr 

3
1回のパスで複数の文字列を置き換える
テンプレートファイルのプレースホルダー文字列を、一般的なUnixツール(bash、sed、awk、perlなど)で具体的な値に置き換える方法を探しています。交換が1回のパスで行われることが重要です。つまり、すでにスキャン/交換されたものを別の交換と見なしてはなりません。たとえば、次の2つの試みは失敗します。 echo "AB" | awk '{gsub("A","B");gsub("B","A");print}' >> AA echo "AB" | sed 's/A/B/g;s/B/A/g' >> AA この場合の正しい結果はもちろんBAです。 一般に、ソリューションは、入力を左から右にスキャンして、指定された置換文字列の1つとの最長一致を検索し、各一致について置換を実行して、入力のそのポイントから続行することと同等でなければなりません(すでに読み込まれた入力も、実行された置換も一致と見なされます)。実際、詳細は関係ありません。置換の結果が全体または一部が別の置換の対象になることはありません。 注私は正しい一般的なソリューションのみを探しています。特定の入力(入力ファイル、検索および置換ペア)で失敗するソリューションを提案しないでください。
11 bash  sed  awk  string  replace 

9
文字列で最も長い数値を出力するにはどうすればよいですか?
文字列で最も長い数値を出力する方法を探しています。 例:文字列がある場合 212334123434test233 どうやって印刷できますか 212334123434 ? 注:数値的に大きな値ではなく、最も長い連続した数列を探しています。 編集:皆さん、答えてくれてありがとう。この質問への回答は非常に圧倒されています。@HaukeLagingの投稿は、私の特定のケースに非常に適しているため、承認済みの回答としてマークしましたが、すべての回答が等しく有効であることを指摘しておきます。問題を解決するためのいくつかの異なるオプションがあることは常に素晴らしいことです。

6
選択したエントリをbibtexファイルから抽出するスクリプト
各エントリが一般的な構造を持つ多くのエントリを持つ大きなbibtexファイルがあります @ARTICLE{AuthorYear, item = {...}, item = {...}, item = {...}, etc } (ARTICLE例によっては別の単語になる場合がありますBOOK) 私がやりたいのは、与えられたAuthorYearでエントリを抽出して新しい.bibファイルに入れる簡単なスクリプト(できればシェルスクリプト)を書くことです。 AuthorYearによるエントリの最初の文と最後の1回のクローズ}で認識でき、おそらくsedエントリの抽出に使用できると想像できますが、正確にこれを行う方法がわかりません。誰かが私にこれをどのように達成するかを教えてもらえますか? それはおそらく次のようなものでなければなりません sed -n "/AuthorYear/,/\}/p" file.bib しかし}、エントリの最初の項目が閉じているため、この出力は停止します。 @ARTICLE{AuthorYear, item = {...}, したがって、これが}行の唯一の文字であるかどうかを認識し、これが当てはまる場合にのみ「sed」で読み取りを停止する必要があります。

12
空の行を削除するためにテキストファイルをフィルタリングする良い方法は何ですか?
空の行がたくさんある(Macの).csvファイルがあります。例: "1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4" "1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.