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

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

新規登録して質問してみよう
ただいま回答率
85.48%
コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

置換

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1153閲覧

pythonをターミナルで実行する際にパイプラインを使いたいけどできない

cutcake

総合スコア14

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

置換

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/03 12:21

編集2019/09/03 12:35

前提・実現したいこと

pythonでファイルの中身の文字列を置換するものを作りました
そこでは
python3 replace.py test a b
と実行することで
test という名前のファイルの
aをb に置換するというものです

ここまでは完成しているのですが
file名 s
test a b

があったときに
python3 replace.py | cat s
と実行しても上手くいきません
何故なのでしょうか できない理由がわかりません

(どうすることによって解決するのでしょうか)
macbookでの実行です

試したこと

javaでの同様なファイルによって
java name | cat txtfile
ということはできることは確認しています
python特有のものなのか...と思っています

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

私の認識では これは純粋にパイプによって読み込みができていないと思っています(認識違いでしょうか?)

test a bTraceback (most recent call last): File "replace.py", line 5, in <module> file_name = args[1]; IndexError: list index out of range

該当のソースコード

今回は複数のものを一括で置換しようと思ったので複数コマンドを受け付けるように作りました

python

1import sys 2import re 3args = sys.argv 4 5file_name = args[1]; 6end = (len(args)-1)//2 + 1; 7 8with open(file_name) as f: 9 data_lines = f.read() 10 11for i in range(1,end): 12 13 # 文字列置換 14 data_lines = re.sub(args[i*2], args[i*2+1],data_lines) 15 # 実行がどれくらい終わったかどうか 16 print("fin : " + str(i) + " | " + args[i*2]+" : "+args[i*2+1]) 17 18# 同じファイル名で保存 19with open(file_name, mode="w") as f: 20 f.write(data_lines) 21

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

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

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

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

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

guest

回答3

0

ベストアンサー

python3 | cat sは意味不明なコマンドで、java name | cat txtfileもほとんど意味不明なコマンドです。
パイプラインに関して、根本的な誤解があるようです。

file名 s

test a b
があったときに

ということだと、おそらく、

sh

1python3 replace.py `cat s`

ということがしたいのではないかと思います。

投稿2019/09/03 12:37

otn

総合スコア84505

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

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

cutcake

2019/09/03 12:57

根本的な認識違いがあったようです。 python3 replace.py `cat s` で実行したとこと上手くいきました 解決しました ありがとうございました。
guest

0

catコマンドは
・コマンドライン引数で指定されたファイルの内容を標準出力へ出力する
・コマンドライン引数に"-"がある場合、標準入力された内容を標準出力する。
です。

今回のプログラムの中で標準出力に該当するのは

print("fin : " + str(i) + " | " + args[i2]+" : "+args[i2+1])

の箇所だけです。
これで出力した内容だけがcatコマンドの標準入力へ入ります。

ただ、今回のcatコマンドはコマンドライン引数に"-"を含んでいないため、実質意味はありません。

test a bTraceback (most recent call last):
File "replace.py", line 5, in <module>
file_name = args[1];
IndexError: list index out of range

これはpython3 replace.pyとしたとき、パラメタを指定してなかったため、argsの長さが1になり、範囲外アクセスになっているだけだと思います。

投稿2019/09/03 12:44

nomuken

総合スコア1627

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

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

cutcake

2019/09/03 12:57

解決しました ありがとうございました。
guest

0

いまいちシチュエーションがわかりませんが、python3 | cat sはそもそもreplace.pyを実行するというコマンドではないので、できなくて当たり前ではないでしょうか。

また、UNIXのパイプは標準入力と標準出力をつなぐものですから、そういう意味でもやはりできなくて当然な気がします(標準入力を読んで標準出力に書き出す、という処理がreplace.pyの中にないので)。

投稿2019/09/03 12:29

hayataka2049

総合スコア30933

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

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

cutcake

2019/09/03 12:50 編集

シチュエーションは 置換をpythonファイルにしておいて 引数を txtに保存しておけば いつでも好きに置換を行えるから便利かなって思った次第です。 `python3 replace.py | cat s` でした 間違えていました(訂正しました) `python3 replace.py test a b` であれば実行できるのは これが標準入力を読んでいる訳ではないからですか? `java hoge test a b ` を `java hoge |cat s` (でした 今訂正しました) と変更しても実行できるのは java と pythonが違うからでしょうか
hayataka2049

2019/09/03 12:44

>python3 replace.py | cat s これも違う。左にあるものの出力が右にあるものの入力にならないといけないので、動く可能性があるのは cat s | python3 replace.py です。あ、でもこれだと出力ファイル名がpython側からわからないので、どうしたものか・・・(stdoutに吐くなら簡単ですが) >`java hoge test a b ` >`java hoge |cat a b` これもまったく意味をなしていません。なんで動くのかは知りませんけど、実行できてもちゃんと動いてないんじゃ? 疑惑があります。
hayataka2049

2019/09/03 12:47 編集

ああ、sの中にファイル名と置換する文字列の情報は書かれてるんですね。そしたらcat s | python3 replace.pyでいけますね。 pythonコードで、引数が与えられなかったときはstdinを読んでその情報に基づいて処理するように書けばオッケーかと。
cutcake

2019/09/03 12:57

解決しました ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問