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

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

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

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

Linux

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

4回答

1053閲覧

複数行あるファイルにおいて、各行の〇文字目から〇文字目の文字列を削除したい。

yk123456

総合スコア0

sed

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

Linux

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2023/07/04 00:19

編集2023/07/04 00:24

実現したいこと

2点ございます。
①複数行あるファイルにおいて、各行の〇文字目から〇文字目の文字列を削除したい。

20100010100000
20100010100101

上記のような文字列があった場合、各行の7文字目から9文字目の「101」を削除するにはLinuxコマンドを使用して
どのように表現すればよいでしょうか。
下記のコマンドだと、二行目の12~14文字目も削除されてしまいました。

cut -c 7-9 test.dat | xargs sed -i 's/101//g' test_.dat

②複数行あるファイルにおいて、各行の〇文字目から〇文字目の文字列を先頭に移動させたい

20100010100000
20100010100101

上記の文字列の7文字目から9文字目の「101」を先頭に移動させるにはどのようなコマンドを実行すればよいでしょうか。

お力添えお願いいたします。

前提

発生している問題・エラーメッセージ

該当のソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

otn

2023/07/04 01:12

> cut -c 7-9 test.dat | xargs sed -i 's/101//g' test_.dat はコピペミスですかね??
yk123456

2023/07/04 01:14

いえ、この通りのコマンドですね...
otn

2023/07/04 01:22

これだと、7-9文字目が101の場合、sed -i 's/101//g' test_.dat 101 101 といコマンドが実行されて、 101はファイル名と見なされますので、101 というファイルがnot foundというエラーになるかと思ったのですが、たまたま 101 というファイルが存在したのですかね。 いずれにせよ、test_.dat と 101 と 101 という3つのファイル(実質2つ)に対して101という文字列の削除をすると言うことなのでやりたいことと乖離があります。
guest

回答4

0

sh

1$ cat test.dat 220100010100000 320100010100101 4 5$ sed -e 's/^\(......\)101\(.*\)/\1\2/' test.dat > test_.dat 6 7$ cat test_.dat 820100000000 920100000101 10 11$ diff test.dat test_.dat 121,2c1,2 13< 20100010100000 14< 20100010100101 15--- 16> 20100000000 17> 20100000101

sh

1$ cat test.dat 220100010100000 320100010100101 420100020100101 5abcdef101xyzzz 6 7$ sed -e 's/^\(......\)\(101\)\(.*\)/\2\1\3/' test.dat > test_.dat 8 9$ cat test_.dat 1010120100000000 1110120100000101 1220100020100101 13101abcdefxyzzz 14 15$ diff test.dat test_.dat 161,2c1,2 17< 20100010100000 18< 20100010100101 19--- 20> 10120100000000 21> 10120100000101 224c4 23< abcdef101xyzzz 24--- 25> 101abcdefxyzzz

投稿2023/07/04 00:40

編集2023/07/04 00:45
shiketa

総合スコア3971

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

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

yk123456

2023/07/04 00:48

早速ご回答ありがとうございます。 すみません、分かりやすく記述するため、上記の内容は簡易的に記載してしまったのですが、 実際に実施したいことは、一行あたり200文字ほどあるなかの70文字目から80文字目の'. .'という半角スペース含めた文字列を削除したいといった内容になります。 こちらはどのように表現すればよいでしょうか。 二度手間な質問になってしまい申し訳ございません。
yk123456

2023/07/04 00:51

②番目も200文字ほどあるなかの70文字目から80文字目の’abcde’を先頭に移動させたいといった内容が実際に行いたいことです。 また、①と②ともにPHP内に記述してソースコードからの実行を想定しております。
shiketa

2023/07/04 04:07

> ②番目も200文字ほどあるなかの70文字目から80文字目の... otnさんの回答にヒントがありました。こうかな。 $ sed -e 's/^\(.\{69\}\)\(abcde\)\(.*\)/\2\1\3/' test.dat > test_.dat あとは .\{69\} のあたりを調整してください。
guest

0

sh

1perl -p -e 's/(?<=^.{6}?)101//g' test.dat > test_.dat

参考

test.dat

text

1123456789. .1234567890 2123456789012345678901234567890 3123456789. .1234567890 4123456789 1234567890 5123456789012345678901234567890

上記から10文字目が「ドット」11文字目~19文字目が「スペース」20文字目が「ドット」の文字列だけ削除

sh

1perl -p -e 's/(?<=^.{9}?)\. {9}\.//g' test.dat > test_.dat

結果

text

11234567891234567890 2123456789012345678901234567890 31234567891234567890 4123456789 1234567890 5123456789012345678901234567890

追加命題のとおりだと

sh

1perl -p -e 's/(?<=^.{69}?)\. {9}\.//g' test.dat > test_.dat

投稿2023/07/04 00:33

編集2023/07/04 01:37
yambejp

総合スコア114843

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

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

yk123456

2023/07/04 00:48

早速ご回答ありがとうございます。 すみません、分かりやすく記述するため、上記の内容は簡易的に記載してしまったのですが、 実際に実施したいことは、一行あたり200文字ほどあるなかの70文字目から80文字目の'. .'という半角スペース含めた文字列を削除したいといった内容になります。 こちらはどのように表現すればよいでしょうか。 二度手間な質問になってしまい申し訳ございません。
yambejp

2023/07/04 01:05

「70文字目から80文字目の'. .'という半角スペース含めた文字列」の意味がわかりません 70文字目が「ドット」71文字目~79文字目が「スペース」80文字目が「ドット」という意味ですか?
yk123456

2023/07/04 01:13

すみません、わかりづらく。 はい、その通りでございます。
yambejp

2023/07/04 01:36

追記しておきました、想定と合致しているか確認お願いします
yk123456

2023/07/04 02:06

ありがとうございます。 ちなみに、この「ドット」が「’」といった文字列に変わった場合は、どのように 修正すればよろしいでしょうか。 なんどもご質問申し訳ございません。
yambejp

2023/07/04 02:16

>「’」といった文字列 perl -p -e 's/(?<=^.{69}?)'\'' {9}'\''//g' test.txt
guest

0

①複数行あるファイルにおいて、各行の〇文字目から〇文字目の文字列を削除したい。

GNU cut コマンドの --complement を使う場合。

bash

1cut --complement -c7-9 test.dat 220100000000 320100000101

②複数行あるファイルにおいて、各行の〇文字目から〇文字目の文字列を先頭に移動させたい

一例として cutpaste を使うなど。

bash

1paste -d '' <(cut -c7-9 test.dat) <(cut --complement -c7-9 test.dat) 210120100000000 310120100000101

投稿2023/07/04 02:38

melian

総合スコア19825

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

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

0

何文字目指定で抜き出したいのなら、cutです。

各行の7文字目から9文字目の「101」を削除するには
一行あたり200文字ほどあるなかの70文字目から80文字目の'. .'という半角スペース含めた文字列を削除したい

sh

1cut -c 1-6,10- 2とか 3cut -c 1-69,81-

7文字目から9文字目の「101」を先頭に移動させる

順番を入れ替えるのはcutでは出来ないので、sed や awk 等を使います。

sh

1sed 's/^\(.\{6\}\)\(.\{3\}\)/\2\1/' 2とか 3awk -v FIELDWIDTHS="6 3 99999" -v OFS= '{print $2,$1,$3}'

投稿2023/07/04 01:30

otn

総合スコア84571

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問