質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

1回答

1397閲覧

文章から記号を削除したい

mikawa

総合スコア13

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2017/11/11 16:44

タスクとしては以下のようなテキストファイル

'TIS 'TIS 'TWERE 'TWERE & & & (A (AND (AND AGAIN,

から記号を削除して以下のようなテキストファイル

TIS TIS TWERE TWERE AMP AMP AMP A AND AND AGAIN

にしたいです。
macのターミナルからコマンドでこの処理をしたいです。

sedを使って処理しようと色々考えましたがどれもうまく行きません

sed -e 's/\W//g' text.txt

またtrを使って以下のように

cat text.txt | tr -d -c [:alnum:] > text_.txt

と打ちましたが、改行文字も削除されてしまって

TISTISTWERETWEREAMPAMPAMPAANDANDAGAIN

以下のような形になってしまいます。
どうすれば良いでしょうか。
ご教授宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

sedで行けます。オプションとしてはsed -e "s/['&;(,]//g" のように指定します。
macOS Sierra 10.12.6 のターミナルでの実行結果を示します。

Bash

1bash-3.2$ cat data.txt 2'TIS 3'TIS 4'TWERE 5'TWERE 6& 7& 8& 9(A 10(AND 11(AND 12AGAIN, 13 14bash-3.2$ sed -e "s/['&;(,]//g" data.txt 15TIS 16TIS 17TWERE 18TWERE 19AMP 20AMP 21AMP 22A 23AND 24AND 25AGAIN 26bash-3.2$ 27

追記 - perl5 での代替策の提案
macOS のターミナルではperl(perl5)も使えるので、こちらの方が簡単かもしれません。sedの代わりとしてawkも選択肢のひとつですが、perlの方が正規表現を含めて強力です。

以下は、\W (単語構成文字(「a~z」「A~Z」「0~9」 アンダーバー「_」))以外を除去するperl5でのワンライナーでのmacOSターミナルでの実行結果です。

Bash

1$ perl -ne 's/\W//g;print $_ . "\n"' data.txt 2TIS 3TIS 4TWERE 5TWERE 6AMP 7AMP 8AMP 9A 10AND 11AND 12AGAIN 13 14$

コマンド部分 's/\W//g;print $_ . "\n"' で、「1行ごとに」「単語構成文字以外を」「全部」「除去して」「プリントし」「最後に改行文字をプリント」します。


コメントにて追加でいただいた質問と確認事項ですが、

自分がやった/Wでうまくいかない理由

macOSのターミナルで使えるsed は、GNU版のsedではなく、BSD版(BSDオリジナルかは分かりませんが)のもので、メタ文字の\W\wが使えない為です。GNU版のsedであれば、質問者様のやろうとしていた\Wが使えます。以下はCygwin上でGNU版のsed(4.4)にて実行した結果です。

$ sed --version sed (GNU sed) 4.4 Packaged by Cygwin (4.4-1) Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Jay Fenlason, Tom Lord, Ken Pizzini, and Paolo Bonzini. GNU sed home page: <http://www.gnu.org/software/sed/>. General help using GNU software: <http://www.gnu.org/gethelp/>. E-mail bug reports to: <bug-sed@gnu.org>. $ sed -e 's/\W//g' data.txt TIS TIS TWERE TWERE AMP AMP AMP A AND AND AGAIN

上記を踏まえて、

ほかにも - や ) や :などがあるのですがその場合も全部書き出してやるのがよいのでしょうか?

macOSのターミナルでBSD版sedを実行するのであれば、全部書き出す必要があります。文字によっては必要に応じてエスケープしなければならないので煩雑かと。以下は、私の最初の回答例に")" と"""(ダブルクォーテーション)を加えた例です。

Bash

1bash-3.2$ cat data2.txt 2'TIS 3'TIS 4"TIS" 5("TIS") 6((""TIS"")) 7'TWERE 8'TWERE 9&AMP; 10&AMP; 11&AMP; 12(A 13(AND 14(AND 15AGAIN, 16 17bash-3.2$ sed -e "s/['&;(,)\"]//g" data2.txt 18TIS 19TIS 20TIS 21TIS 22TIS 23TWERE 24TWERE 25AMP 26AMP 27AMP 28A 29AND 30AND 31AGAIN 32bash-3.2$ 33

投稿2017/11/11 17:04

編集2017/11/12 02:56
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikawa

2017/11/12 00:55

これはこの文章のほんの一部でほかにも - や ) や :などがあるのですがその場合も全部書き出してやるのがよいのでしょうか? また自分がやった/Wでうまくいかない理由がわかれば教えてください。
dodox86

2017/11/12 02:53

perlでの代替策の提案と、質問事項について追記しましたのでご覧ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問