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

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

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

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

4回答

6287閲覧

sed コマンドで特定の文字を削除する方法

hagi_moge

総合スコア12

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2020/01/21 02:54

sed コマンドを用いて特定の文字があるときだけ、それ以降の特定の文字を削除したいです。

例えば下記のような文字列の中に"aaa"が存在するときだけそれに続く"-ccc"を削除したい場合は
どのようなsedコマンドを記述すればよろしいでしょうか?ご教授お願い致します。

入力 aaa-ccc の場合

echo `echo "aaa-ccc" | sed xxx`

期待する出力

> aaa

入力 bbb-ccc の場合

echo echo `echo "bbb-ccc" | sed xxx`

期待する出力

> bbb-ccc

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

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

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

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

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

yambejp

2020/01/21 03:07

「xxxaaa-ccc」は「xxxaaa」なのでしょうか? 「aaa-ccc-aaa-ddd」は「aaa」なのでしょうか?
hagi_moge

2020/01/21 04:12

曖昧な表現で申し訳ございません。 現在出てきている下記の2ケースで、今のところこのケースに対応できれば問題ありません。(xxxのみ可変) ・aaa-xxx-ccc ・bbb-xxx-ccc
guest

回答4

0

単に、sed 's/aaa-ccc/aaa/'でいいのでは?

投稿2020/01/21 11:21

otn

総合スコア84538

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

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

0

特定の文字列が合った場合(ex : aaa)、ハイフン以降を削除する、といった内容であれば、以下のようにも記述できます。

bash

1$ sed '/aaa/s/-.*//'

投稿2020/02/13 14:30

編集2020/02/18 22:48
genzouw

総合スコア33

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

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

0

ベストアンサー

正規表現で「肯定的後読み」が使えれば自然に書けるのですが、sedでは使えないようです。
ちなみにperlでやると次のようになります。

terminal

1$ echo `echo "aaa-ccc" | perl -pe 's/(?<=aaa)-ccc//g'` 2aaa 3$ echo `echo "bbb-ccc" | perl -pe 's/(?<=aaa)-ccc//g'` 4bbb-ccc

sed コマンドを用いて特定の文字があるときだけ、それ以降の特定の文字を削除したいです。

「特定の文字」が限られていて有限回列挙することが可能であるのなら、書けなくはないですね。

例えば「aaa」または「000」に続く場合だけ「-ccc」「-xxx」「-yyy」「-zzz」を削除するなら
次のようになります。sedに拡張正規表現を有効にする「-r」オプションをつけています。

terminal

1echo `echo "bbb-xxx" | sed -r -e 's/(aaa|000)(-ccc|-xxx|-yyy|-zzz)/\1/g'`

投稿2020/01/21 03:28

hidezzz

総合スコア1248

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

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

hagi_moge

2020/01/21 04:24

回答ありがとうございます。 hidezzz san の方法を参考にさせて頂きやりたいこと概ね解決できました。 perlでの方法もありがとうございます。perlの方が文字列の処理は長けているのですね!今後の参考にさせて頂きます。
guest

0

ちょっと質問にブレがありますが

sh

1echo "aaa-ccc"|sed "s/(aaa).*/\1/" 2echo "bbb-ccc"|sed "s/(aaa).*/\1/"

投稿2020/01/21 03:20

yambejp

総合スコア114829

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

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

hagi_moge

2020/01/21 04:15

回答ありがとうございます。 この場合aaaに続く不特定の文字列全てを削除してしまうと思いますが これを指定した任意の文字列(-ccc)のみを削除することはできますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問