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

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

3
Regex&Sed / Perl:ISNの前に別の単語がない単語に一致
前に特定の単語がない単語をすべて使用sedまたはperl置換したい。 たとえば、映画のプロットが含まれているテキストファイルがあり、出現するすべてのキャラクターの姓を名に置き換えたいのは、姓が姓の直前にない場合のみです。 サンプルテキストは次のようになります。 John Smith and Jane Johnson talk about Smith's car. 私はそれをこのように見せたいです: John Smith and Jane Johnson talk about John's car. 私がちょうどするならsed 's/Smith/John/' file、私は持っているでしょう: John John and Jane Johnson talk about John's car. 姓の前にある名は常に同じになります。私はに対処する必要はありませんJohn SmithとFrank Smith。私SmithはJohnそれに先行していないマッチする方法が必要です。


5
順序を維持しながら隣接する重複行を削除する
それぞれが何回も繰り返される名前が1列のファイルがあります。同じ名前の他の繰り返しに隣接していない同じ名前の他の繰り返しを維持しながら、各繰り返しを1つに圧縮したい。 例えば、私は左側を右側に向けたいです: Golgb1 Golgb1 Golgb1 Akna Golgb1 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna Akna Spata20 Spata20 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna これは私が使用してきたものです。perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt ただし、この方法では左から1つの代表のみが保持されます(つまり、Golb1とAknaは繰り返されません)。 複数の隣接しないブロックで繰り返される名前を維持しながら、各ブロックの一意の名前を維持する方法はありますか?
11 awk  sed  sort  uniq 


2
sed-複数のファイルに変更を適用
「</foo:bar>」を含む何百ものファイルがあります cc bb aa </foo:bar> dd xx vv 一度に全部変えたい cc bb aa </foo:bar> 正確なファイル名を指定すると、sedはうまく機能します sed -i "/ </ foo:bar> / q" 99999.txt しかし、一度にすべてを変更しようとすると、結果が得られません。 sed -i "/<\/foo:bar>/q" *.txt

3
特定の文字列で始まる列を出力する
次のようなファイルがあります。 ID101 G T freq=.5 nonetype ANC=.1 addinfor ID102 A T freq=.3 ANC=.01 addinfor ID102 A T freq=.01 type=1 ALT=0.022 ANC=.02 addinfor ご覧のように、各行にはわずかに異なる数の列があります。具体的には、列1、列2、列3、列4、および次で始まる列が必要です。ANC= 望ましい出力: ID101 G T freq=.5 ANC=.1 ID102 A T freq=.3 ANC=.01 ID102 A T freq=.01 ANC=.02 私は通常、awkコマンドを使用してファイルを解析します。 awk 'BEGIN {OFS = "\t"} {print $1, $2, $3, $4}' …

8
テキストファイルを固定数の単語を含む行に分割する
関連していますが、満足のいく答えはありません。大きなテキストファイルを500ワード程度のチャンクに分割するにはどうすればよいですか。 私は、1行に10 ^ 7ワードを超えるテキストファイル(http://mattmahoney.net/dc/text8.zip)を取得し、それをそれぞれNワードの行に分割しようとしています。私の現在のアプローチは機能しますが、かなり遅くて醜いです(シェルスクリプトを使用)。 i=0 for word in $(sed -e 's/\s\+/\n/g' input.txt) do echo -n "${word} " > output.txt let "i=i+1" if [ "$i" -eq "1000" ] then echo > output.txt let "i=0" fi done これをより速く、またはよりコンパクトにするためのヒントはありますか?

5
シェルを使用してMACアドレスからIPv6アドレスを取得する方法
MACアドレスを使用して、たとえばネットワーク内で一意である必要があるリンクローカルIPv6アドレスなどのインターフェイス識別子を作成できることはわかっています。 画像はこれを行う方法を示しています: 私の質問は: awkまたはを使用してMACからIPv6アドレスを作成するにはどうすればよいsedですか? または、特定のMAC(そのようなものcreateIPv6 myMAC)のリンクローカルIPv6アドレスを取得するコマンドはありますか?
11 sed  awk  ipv6  mac-address 

2
sedの正規表現文字をエスケープして、正規表現文字として解釈する必要があるのはなぜですか?
例えばそうです cat sed_data.txt | sed 's/\b[0-9]\{3\}\b/NUMBER/g' 、私がすることをしなければならない正規表現を形成するために、文字をエスケープします。この場合、何度も解釈されるために中括弧をエスケープする必要がありました。 どうして?エスケープされない限り、すべてが正規表現文字になると期待していました。すなわち反対です。

3
パイプラインでの複数のtrプロセスを回避するために、trコマンドをチェーン化できますか?
私はたくさんのtxtファイルを持っています。それらを小文字で、アルファベットと1行につき1ワードだけ出力したいのですが、次のようなtrパイプラインでいくつかのコマンドを使用して実行できます。 tr -d '[:punct:]' <doyle_sherlock_holmes.txt | tr '[:upper:]' '[:lower:]' | tr ' ' '\n' これを1回のスキャンで実行することは可能ですか?私はこれを行うには、Cプログラムを書くことができますが、私は感じて使用してそれを行う方法がありますようにtr、sed、awkまたはperl。
11 sed  awk  perl  tr 

2
sed:2行に一致
レコードが2行に分割されているテキストファイルがあります。1行にまとめたいと思います。レコードは次のようになります。 2013-07-29 apt-get install git 2013-07-29 apt-get install rsync 2013-07-31 apt-get install nmap 2013-08-02 apt-get install cifs-utils 2013-08-05 apt-get install telnet 以下を入手したいと思います。 2013-07-29 apt-get install git 2013-07-29 apt-get install rsync 2013-07-31 apt-get install nmap 2013-08-02 apt-get install cifs-utils 2013-08-05 apt-get install telnet で試しましたがsed、2行一致しません。いくつかのトリックはありますかsed、それともより良いツールがありますか?

2
perlとsedの印刷できない文字を置き換える
ファイル内の一部の印刷できない文字をスペースで置き換える必要があります。 具体的には、(TAB)、(改行)、(CR)を除く、から0x00までのすべての文字0x1F0x090x0A0x0D 今までは0x00キャラクターを入れ替えるだけでした。私の以前のOSはAIX(GNUコマンドなし)だったので、使用できませんsed(まあ、使用できますが、いくつかの制限がありました)。だから、私はを使用して次のコマンドを見つけましたperl、それは期待通りに機能しました: perl -p -e 's/\x0/ /g' $FILE_IN > $FILE_OUT 現在はLinuxを使用しているので、sedコマンドを使用できると期待していました。 私の質問: このコマンドはそれらの文字を置き換えるのに適切ですか?私が試しました、そしてそれはうまくいくようですが、私は確かめたいです: perl -p -e 's/[\x00-\x08\x0B\x0C\x0E-\x1F]/ /g' $FILE_IN > $FILE_OUT perl -pとして動作すると思ったsed。それでは、なぜ前のコマンドは機能し(少なくとも失敗しません)、次のコマンドは機能しませんか? sed -e 's/[\x00-\x08\x0B\x0C\x0E-\x1F]/ /g' $FILE_IN > $FILE_OUT それは私に伝えます: sed:-e expression#1、char 34:無効な照合文字
11 sed  perl 

7
単語を改行で置き換える方法
次のデータを含むテキストファイルがあり、各行の末尾は|END|です。 T|somthing|something|END|T|something2|something2|END| 私はsed |END|で\n新しい行に置き換えることを試みています。 sed 's/\|END\|/\n/g' test.txt しかし、それは以下のような間違った出力を生成しています: T | s o m e ... しかし、私が欲しいのはこれです: T|somthing|something T|something2|something2 私も試してみましたtr。それもうまくいきませんでした。

3
なぜ `sed expr1 | sed expr2`は `sed -e expr1 -e expr2`とは異なります
出力を分割しidて、ユーザーがメンバーであるグループのより読みやすいリストごとのリストを提供していました。 id roaima | sed 's/,/\n\t/g' uid=1001(roaima) gid=1001(roaima) groups=1001(roaima) 24(cdrom) 25(floppy) ... 822413650 (international (uk) location) グループ番号を括弧で囲まれた名前から分離したかったので、このように式を拡張しました id roaima | sed -e 's/,/\n\t/g' -e '2,$s/(/ (/' しかし、これは当初期待したようには機能しませんでした。2番目の式は効果がないようです。 代わりに、必要な結果を得るにはsed、次のように2つの個別のコマンドを実行する必要がありました。 id roaima | sed -e 's/,/\n\t/g' | sed '2,$s/(/ (/' uid=1001(roaima) gid=1001(roaima) groups=1001(roaima) 24 (cdrom) 25 (floppy) ... 822413650 (international (uk) location) …
10 sed  group 

2
この3つのことをこのbashコードで説明してくれませんか?
私が持っているfunction私の中.bashrcのファイル。私はそれが何をしているのか知っています、それはX個の多くのディレクトリをcd ここにあります: up() { local d="" limit=$1 for ((i=1 ; i <= limit ; i++)) do d=$d/.. done d=$(echo $d | sed 's/^\///') if [ -z "$d" ]; then d=.. fi cd $d } しかし、それについてこれらの3つのことを私に説明できますか? d=$d/.. sed 's/^\///' d=.. なぜこのようにしないのですか? up() { limit=$1 for ((i=1 ; i <= limit ; …

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