web-dev-qa-db-ja.com

テキストファイルの特定の文字を削除する

テキストファイルがあります。その内容は以下の通りです。

$ cat file.txt
[] [1]foo1 bar1
[] [2]foo2 bar2
[] [35]foo3 bar3
[] [445]foo4 bar4
[] [87898]foo5 bar5

Awkを使用して最初の列を正常に削除できますが、[num]文字は文字列に関連付けられているため削除できません。

以下のような出力を取得しようとしています

$ cat file.txt
foo1 bar1 
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
1
smc
$ sed 's/.*]//' file.txt | tr -s ' '
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

sedは、最後の]までの(およびそれを含む)行のすべてを削除し、trは、連続する複数のスペースを単一のスペースに圧縮します。

または、sedのみを使用します。

sed -e 's/.*]//' -e 's/  */ /g' file.txt

指定された入力データを使用して、最初のパイプラインと同じ出力を生成します。

このsedは最初にs/.*]//を実行し、]まで(すべて)を削除します。 2番目の式は␣␣*、つまりスペースの後に0個以上のスペースが続くものに一致し、これらを1つのスペースに置き換えます。 2番目の式は行全体に適用され、tr -s ' 'と同じ効果があります。つまり、連続する複数のスペースを単一のスペースに圧縮します。


awkの使用:

awk -F '[][:blank:]]*' '{ print $3,$4 }' file.txt

ここでは、フィールド区切り文字として]またはスペースまたはタブを使用します(これらの倍数は2つの列を区切る場合があるため、*の後に[...]を使用します)。これらのセパレータを指定すると、必要なデータは各行のフィールド3および4で利用できます。


質問のデータを編集して、最後の2つの列の間のスペースをいくつか削除した後、次の操作も機能します。

cut -d ']' -f 3 file.txt

あるいは、単に

sed 's/.*]//' file.txt

または

awk -F ']' '{ print $3 }' file.txt
6
Kusalananda

sedを使用できます

$ sed -e 's/.*]//g' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

`awkを使用できます

$ awk -F'.*]' '{print $2}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
1
tachomi

Awkの使用:

$ awk '{$2=substr($2,index($2,"]")+1);print $2,$3}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

2番目のパラメータ$2は、最初に見つかった]からのsubstrを使用して切り捨てられます。次に、パラメーター2と3が印刷されます。

0
oliv

カットあり

cut -d ] -f3 file.txt
0
ctac_

別のawk提案

awk '{gsub(/\[.+foo|\]/,"foo")}1' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
0
Claes Wikner