我试图在Perl中创建一些基本上像Unix tee命令的东西.我正在尝试阅读每一行STDIN,在其上运行替换,然后打印它.(最后,也将它打印到一个文件.)如果我使用控制台输入,这是有效的,但如果我尝试将输入管道输入到命令它不会做任何事情.这是一个简单的例子:
print "about to loop\n";
while(<STDIN>)
{
s/2010/2009/;
print;
}
print "done!\n";
Run Code Online (Sandbox Code Playgroud)
我尝试像这样管道dir命令:
C:\perltest>dir | mytee.pl about to loop done!
为什么没有看到管道输入?(我在WinXP上使用Perl 5.10.0,如果这是相关的.)
下面的程序打印标准写入的每个字符,但只有在写完新行之后(至少在我的系统上!).
public class Test {
public static void main(String[] args) throws java.io.IOException {
int c;
while ((c = System.in.read()) != -1)
System.out.print((char) c);
}
}
Run Code Online (Sandbox Code Playgroud)
这可以防止人们写"按任意键继续"之类的内容,并强制执行"按Enter键继续"等操作.
我有一个node.js脚本/服务器,它在启动时读取stdin的一些输入.但是,有时候没有数据要传入.这很麻烦,因为在这种情况下似乎既不调用data也不end调用事件.如何在node.js代码中检测到这种情况?
我想避免在输入结束时附加特殊的"结束"字符,以免给客户带来不便.相关代码如下:
var newHTML = '';
var gfm = spawn(__dirname + '/node_modules/docter/bin/github-flavored-markdown.rb');
process.stdin.on('data', function(chunk){
gfm.stdin.write(chunk);
});
process.stdin.on('end', function(){
gfm.stdin.end();
});
gfm.stdout.on('data', function(data) {
newHTML += data;
});
gfm.on('exit',function(ecode){
socket.emit('newContent', newHTML);
});
process.stdin.resume();
Run Code Online (Sandbox Code Playgroud) 每个人都知道如何计算C中STDIN中的字符.但是,当我尝试在python3中执行此操作时,我发现它是一个谜题.(counter.py)
import sys
chrCounter = 0
for line in sys.stdin.readline():
chrCounter += len(line)
print(chrCounter)
Run Code Online (Sandbox Code Playgroud)
然后我尝试通过测试程序
python3 counter.py < counter.py
Run Code Online (Sandbox Code Playgroud)
答案只是第一行"import sys"的长度.实际上,程序只读取标准输入的第一行,并丢弃其余部分.
如果我用sys.stdin.read()代替sys.stdin.readline它将会工作.
import sys
print(len(sys.stdin.read()))
Run Code Online (Sandbox Code Playgroud)
但是,很明显,该程序不适合大量输入.请给我一个优雅的解决方案.谢谢!
有时您希望ffmpeg询问您是否应该覆盖文件.有时它只是一个你喜欢的脚本如果出现问题就会失败.即如果你有问题,也不要依赖stdin来回答.
我正在尝试将一个字符串传递给程序的STDIN 而没有任何尾随换行符(除非该字符串本身实际上以换行符结束).我试过谷歌搜索,但我只发现有人试图打印到控制台没有拖尾换行,在这种情况下Write-Host需要一个参数-NoNewLine.但是,要将它传输到另一个程序,我需要Write-Output或类似的没有这样的参数.现在似乎Write-Output甚至不是问题:
Z:\> (Write-Output "abc").Length
3
Run Code Online (Sandbox Code Playgroud)
但是,只要我将它传送到另一个程序并在那里读取字符串,我就会得到一个额外的换行符.例如,我尝试了这个Ruby片段:
Z:\> Write-Output "abc" | ruby -e "p ARGF.read"
"abc\n"
Run Code Online (Sandbox Code Playgroud)
我检查了收到的实际字符串是abc\n.其他几种语言(至少是C#,Java和Python)也是如此,所以我认为这是PowerShell的一个问题,而不是阅读的语言.
作为进一步的测试,我Write-Output用另一个Ruby脚本替换自己:
Z:\> ruby -e "$> << 'abc'"
abcZ:\>
Run Code Online (Sandbox Code Playgroud)
(也就是说,\n脚本的STDOUT 肯定没有.)
但是,当我将它传递到另一个脚本时:
Z:\> ruby -e "$> << 'abc'" | ruby -e "p ARGF.read"
"abc\n"
Run Code Online (Sandbox Code Playgroud)
我相信它是添加换行的管道.我该如何避免?我实际上希望能够控制输入是否以换行结束(通过将其包含在输入中或省略它).
(作为参考,我还测试了已包含尾随换行符的字符串,在这种情况下,管道不会添加另一个换行符,所以我猜它只是确保拖尾换行符.)
我最初在PowerShell v3中遇到过这种情况,但我现在正在使用v5,但仍然存在同样的问题.
我有代码打开并从二进制文件中读取文件.
with open (file, mode="rb") as myfile:
message_string=myfile.read()
myfile.close
Run Code Online (Sandbox Code Playgroud)
我现在需要从stdin读取相同的内容.但我无法弄清楚如何阅读二进制文件.
该错误仅表示字节字符串.
有什么建议?
我有一个CLI脚本,希望它从文件中读取数据.它应该能够以两种方式阅读:
cat data.txt | ./my_script.py./my_script.py data.txt- 有点像grep,例如.
我知道的:
sys.argv并optparse让我轻松地阅读任何指定参数和选项.sys.stdin 让我读一下管道传输的数据fileinput 使整个过程自动化不幸:
fileinputstdin和任何args作为输入.所以我不能使用非文件名的选项,因为它试图打开它们.sys.stdin.readlines() 工作正常,但如果我不管道任何数据,它会挂起,直到我进入 Ctrl + Dstdin总是True在布尔上下文中.如果可能的话,我想以便携的方式做到这一点.
我在同一个项目中使用windows和linux机器.Windows上stdin的默认编码是cp1252,linux上的默认编码是utf-8.
我想把一切都变成uft-8.可能吗?我该怎么做?
我想要我的应用节目:
press any key to exit ...
当我按任意键时,它会退出.
我怎样才能做到这一点?
注意:我用谷歌搜索了但是我发现的所有内容都需要在最后输入.我想要像Console.ReadKey()C#中的东西.
我正在运行MS Windows.