タグ付けされた質問 「text-processing」

プログラム、スクリプトなどによるテキストの操作または検査

8
ファイル内の文字列を置き換えるにはどうすればよいですか?
特定の検索条件に基づいてファイル内の文字列を置き換えることは非常に一般的なタスクです。どうやって 現在のディレクトリ内のすべてのファイルで文字列fooを置き換えますbarか? サブディレクトリにも同じことを繰り返しますか? ファイル名が別の文字列と一致する場合にのみ置き換えますか? 特定のコンテキストで文字列が見つかった場合にのみ置き換えますか? 文字列が特定の行番号にある場合は置き換えますか? 複数の文字列を同じ置換で置き換えます 複数の文字列を異なる置換に置き換えます
752 text-processing  awk  sed  perl 

4
なぜprintfはechoよりも優れているのですか?
私はそれprintfがより良いと聞いたことがありますecho。RHEL 5.8の一部のプログラムにテキストを入力するprintfために動作echoしなかったため、使用しなければならなかった私の経験から1つのインスタンスのみを思い出すことができますprintf。しかし、明らかに、他にも違いがあるので、それらの違いや、一方を使用する場合と特定の場合を使用する場合について質問したいと思います。

10
ファイルに複数の行を追加する方法
ファイルが存在しない場合はそれを探して作成し、これを追加するbashスクリプトを作成しています。 Host localhost ForwardAgent yes だから"line then new line 'tab' then text"私はそれが敏感なフォーマットだと思う。私はあなたがこれを行うことができることを知っています: cat temp.txt >> data.txt しかし、その2行からは奇妙に見えます。これをこの形式で追加する方法はありますか? echo "hello" >> greetings.txt

8
grepは、一致する指定されたグループのみを出力できますか?
ファイルがあるとしましょう: # file: 'test.txt' foobar bash 1 bash foobar happy foobar 「foobar」の後に表示される単語のみを知りたいので、この正規表現を使用できます。 "foobar \(\w\+\)" 括弧は、foobarの直後の単語に特別な関心があることを示しています。しかし、aを実行するとgrep "foobar \(\w\+\)" test.txt、「foobarの後の単語」ではなく、正規表現全体に一致する行全体が取得されます。 foobar bash 1 foobar happy そのコマンドの出力が次のようになっていることを望みます。 bash happy 正規表現でグループ化(または特定のグループ化)に一致するアイテムのみを出力するようにgrepに指示する方法はありますか?

4
シェルループを使用してテキストを処理するのは悪い習慣と見なされるのはなぜですか?
whileループを使用してテキストを処理することは、POSIXシェルでは一般的に悪い習慣と見なされていますか? 以下のようステファンChazelasが指摘し、シェルのループを使用していない理由のいくつかはある概念、信頼性、読みやすさ、パフォーマンスとセキュリティ。 この回答では、信頼性と読みやすさの側面について説明しています。 while IFS= read -r line <&3; do printf '%s\n' "$line" done 3< "$InputFile" パフォーマンスのために、ファイルまたはパイプから読み取る場合、whileループと読み取りは非常に遅くなります。これは、読み取りシェルに組み込まれたコマンドが一度に1文字ずつ読み取るためです。 どの程度概念やセキュリティ面?

18
du出力をサイズでどのようにソートしますか?
du -sh /dir/*サイズで並べ替える方法は?私は使用を言っているサイトを読みました| sort -nが、それは明らかに間違っています。間違った例を次に示します。 [~]# du -sh /var/* | sort -n 0 /var/mail 1.2M /var/www 1.8M /var/tmp 1.9G /var/named 2.9M /var/run 4.1G /var/log 8.0K /var/account 8.0K /var/crash 8.0K /var/cvs 8.0K /var/games 8.0K /var/local 8.0K /var/nis 8.0K /var/opt 8.0K /var/preserve 8.0K /var/racoon 12K /var/aquota.user 12K /var/portsentry 16K /var/ftp 16K /var/quota.user ...


10
いくつかの出力の各行から先頭と末尾の空白をトリミングするにはどうすればよいですか?
出力の各行から先頭と末尾のスペースとタブをすべて削除したいと思います。 trim出力をパイプすることができるような簡単なツールはありますか? サンプルファイル: test space at back test space at front TAB at end TAB at front sequence of some space in the middle some empty lines with differing TABS and spaces: test space at both ends

6
特定の列サイズでテキストを折り返すにはどうすればよいですか?
私はcat test.txt | pr -w 80行を80文字幅に折り返すようなものを使用できることを知っていますが、それは印刷された行の上部と下部に多くのスペースを置き、一部のシステムでは正しく動作しません 長い行を含むテキストファイルを特定の幅で折り返すようにするための最良の方法は何ですか? 単語を壊さないようにすることができればボーナスポイント。

14
巨大な(70GB)、1行のテキストファイルの文字列を置き換えます
巨大な(70GB)1行のテキストファイルがあり、その中の文字列(トークン)を置き換えたいと思います。token <unk>を別のダミートークンに置き換えたい(グローブの問題)。 私が試したsed: sed 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new しかし、出力ファイルにcorpus.txt.newはゼロバイトがあります! 私もperlを使ってみました: perl -pe 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new しかし、メモリ不足エラーが発生しました。 小さいファイルの場合、上記の両方のコマンドが機能します。 そのようなファイルである文字列を置き換えるにはどうすればよいですか? これは関連した質問ですが、答えはどれもうまくいきませんでした。 編集:ファイルを10GBのチャンク(または何でも)に分割し、それぞれに適用sedしてからマージするのはcatどうですか?それは理にかなっていますか?よりエレガントなソリューションはありますか?

9
テキストファイル内の重複行を削除する方法は?
私の巨大な(最大2 GiB)テキストファイルには、その中のすべての行の約100の正確な複製が含まれています(ファイルはCSVのようなデータテーブルであるため、私の場合は役に立ちません)。 私が必要なのは、元のシーケンスの順序を維持しながら、すべての繰り返しを削除することです(ただし、これはパフォーマンスを大幅に向上させるために犠牲にすることができます)。結果では、各行は一意である必要があります。等しい行が100行ある場合(通常、重複はファイル全体に広がり、隣人にはなりません)、残された種類は1つだけです。 これを実装するためのプログラムをScalaで作成しました(Scalaを知らない場合はJavaを検討してください)。しかし、おそらくこれをより高速に実行できる、より高速なCで作成されたネイティブツールがあるのでしょうか。 更新:awk '!seen[$0]++' filenameファイルが2 GiB以下に近い限り、解決策はうまく機能しているように見えましたが、8 GiBファイルをクリーンアップしようとしても機能しなくなりました。4 GiB RAMを搭載したMacと4 GiB RAMおよび6 GiBスワップを搭載した64ビットWindows 7 PCで無限に実行されているように見えます。そして、この経験を考えると、4 GiB RAMを搭載したLinuxで試してみることに熱心ではありません。

6
bashを使用して変数から特定の文字を削除します
変数(私の場合は開発キットバージョン)を解析して、dot(.)を無料にします。の場合version='2.3.3'、目的の出力は233です。 私は以下のように試しましたが、.私を与える別のキャラクターに置き換える必要があります2_3_3。うまく行けば大丈夫tr . ''だっただろう。 1 VERSION='2.3.3' 2 echo "2.3.3" | tr . _

4
一致するパターンの後の行の部分のみを返す
したがって、ファイルを開いcatてgrepから一致する行を取得するために使用するのは、現在扱っている特定のログセットを操作しているときだけです。行をパターンに一致させる方法が必要ですが、一致後の行の部分のみを返す必要があります。試合の前後の部分は一貫して変化します。sedまたはを使用して遊んでawkいますが、一致する前に部分を削除するか、一致した後に部分を返すために行をフィルタリングする方法を見つけることができませんでした。これは、フィルタリングする必要がある行の例です。 2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 } 私が必要とする部分は「停止」後のすべてです。 この背景には、何かがストールする頻度を見つけることができるという背景があります。 cat messages | grep stalled | wc -l 私がする必要があるのは、特定のノードが何回ストールしたかを調べることです(「ストール」後の各コロンの前の部分で示されます。失速していないので、私は助けにはなりません。 すべての意図と目的のために、これは標準のGNUコアutilsを備えたfreebsdシステムですが、支援するために追加のものをインストールすることはできません。

13
デコードURLエンコード(パーセントエンコード)
URLエンコードをデコードしたいのですが、これを行うための組み込みツールはありますか、またはsedこれを行うコードを提供してくれる人はいますか? unix.stackexchange.comとインターネットを少し検索しましたが、URLエンコードをデコードするためのコマンドラインツールが見つかりませんでした。 私がやりたいことは、txtファイルを編集して、次のようにすることです。 %21 になる ! %23 になる # %24 になる $ %26 になる & %27 になる ' %28 になる ( %29 になる ) 等々。

15
バイトカウントを人間のKiB MiBなどに変換する標準ツール。du、ls1など
1.00から1023.99の間の数値を維持しながら、バイトの整数カウントを人間が読める最大の単位サイズのカウントに変換する標準ツールはありますか? 私は自分のbash / awkスクリプトを持っていますが、多くの/ほとんどのディストリビューションで見られる標準ツールを探しています...より一般的に利用可能なもので、理想的には単純なコマンドライン引数を持ち、および/またはパイプ入力を受け入れることができます。 ここに私が探している出力の種類の例をいくつか示します。 1 Byt 173.00 KiB 46.57 MiB 1.84 GiB 29.23 GiB 265.72 GiB 1.63 TiB これがバイト人間スクリプトです(上記の出力に使用) awk -v pfix="$1" -v sfix="$2" 'BEGIN { split( "Byt KiB MiB GiB TiB PiB", unit ) uix = uct = length( unit ) for( i=1; i<=uct; i++ ) val[i] = ...

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