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

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

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

sed

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

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Q&A

解決済

3回答

6487閲覧

sedで特定のフィールドの特定の文字列を置換したい

退会済みユーザー

退会済みユーザー

総合スコア0

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

sed

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

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

0グッド

0クリップ

投稿2021/06/21 07:54

sedで特定のフィールドの特定の文字列を置換したいです。

以下のテキストファイルの8フィールド目に”tera66”という文字列が含まれていた場合、
その部分を”tera44”に置換したいです。

txt

124 ora 2/4 0:00 ! 5 taro ora_tera66g 226 ora 2/4 0:00 ! 5 taro ora_tera66g 329 ora 2/4 0:00 ! 5 taro ora_tera66g 431 a_tera66 2/4 0:00 ! 5 taro ora_tera66g 539 ora 2/4 0:00 ! 5 taro ora_tera66g

これを

txt

124 ora 2/4 0:00 ! 5 taro ora_tera44g 226 ora 2/4 0:00 ! 5 taro ora_tera44g 329 ora 2/4 0:00 ! 5 taro ora_tera44g 431 a_tera66 2/4 0:00 ! 5 taro ora_tera44g 539 ora 2/4 0:00 ! 5 taro ora_tera44g

にしたいです。

awkとsedを使い試してみました。
しかし、awkだとフィールドの指定はうまくいくのですが空白の区切りが詰めて表示されてしまうためフォーマットが崩れます。

awk

1cat test.txt | awk '{gsub(/tera66/,"tera44",$8); print }'

sedだとフォーマットは崩れてしまわないのですが、4行目のtera66まで置換されてしまいます。

sed

1sed 's/tera66/tera44/g'

正規表現を使い、sedで8フィールド目を指定しようとしているのですが、思い通りの結果が出ません。

sed

1sed 's/[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]tera66/tera44/g'

アドバイスいただけると嬉しいです。
よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

行の最後に出現するやつだけ置換する方針でいいなら

bash

1kw1=`echo 'tera66' | rev` 2kw2=`echo 'tera44' | rev` 3rev hoge.txt | sed "s/$kw1/$kw2/" | rev >fuga.txt

投稿2021/06/22 00:43

takasima20

総合スコア7458

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

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

退会済みユーザー

退会済みユーザー

2021/06/22 01:22

ご回答いただきありがとうございます。 そのように書くこともできるのですね、 勉強になります。 ありがとうございます。
guest

0

フィールドを指定した処理をしたいのであれば明らかにawk向きです。

awkだとフィールドの指定はうまくいくのですが空白の区切りが詰めて表示されてしまうためフォーマットが崩れます。

変数OFSを指定してやれば良いです。

cat test.txt | awk ' \ BEGIN{OFS="\t"} \ # タブ区切りで出力したいんですよね? { \ gsub(/tera66/,"tera44",$8); \ $1=$1 ""; \ # 強制的にフィールド変数を「書き換え」ることにより$0を更新させてOFSの設定を反映させる。 print \ }'

投稿2021/06/21 08:14

KojiDoi

総合スコア13671

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

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

退会済みユーザー

退会済みユーザー

2021/06/22 01:10

回答いただきありがとうございます! OFSの設定自体を知らなかったです。 勉強になります。
guest

0

ベストアンサー

sedでやると、

sh

1sed -E 's/(([^ ]+ +){7}[^ ]*?)tera66/\1tera44/g'

ですが、8フィールド目に複数のtera66があっても1つか置換しないので、いまいちですが、

sh

1sed -E ':X;s/(([^ ]+ +){7}[^ ]*?)tera66/\1tera44/g;t X'

のように繰り返すか。

gnu sedじゃないと-Eは使えないので、他のsedの場合は適当に修正してください。

投稿2021/06/21 09:49

編集2021/06/22 08:04
otn

総合スコア84555

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

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

退会済みユーザー

退会済みユーザー

2021/06/22 01:12

回答いただきありがとうございます。 正規表現をそのように使うと良いのですね。 複数出てくる場合についてもう少し考えてみます。 勉強になります。ありがとうございます!
退会済みユーザー

退会済みユーザー

2021/06/23 02:48

再回答ありがとうございます! 追記していただいたものだと複数時でも置換されました。 差し支えなければ、「:X; 〜 ;t X」をつけることによって、 どのような動きに変化したのかお教えいただけないでしょうか? それか、お手間でしたらこの解説が知りたいので、検索方法についてお教え頂きたいです。 よろしくお願い致します。
otn

2021/06/23 06:15

man sed に書いてあります。 :X がgotoの飛先ラベルで、t X が、if(s is success) goto X ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問