- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试解决一个简单的黑客问题,但我被卡住了。
在命令行上执行 grep 时,我没有问题grep -i \"the[^a-z0-9]\" $filename <<< "from fairest creatures we desire increase"
结果:(不返回任何内容)grep -i \"the[^a-z0-9]\" $filename <<< "the clock struck twice"
结果:(突出显示的)时钟敲响了两次
我读了这篇文章:
Can I open bash from a popen() stream?
我试过在 grep 命令前面加上“exec bash -c”和“/bin/bash -c”但无济于事。
谁能告诉我为什么我会收到这个错误以及如何解决它?
sh: 1: 语法错误:重定向意外
f 为空
我的代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include<cmath>
using namespace std;
int main(){
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int MAX_BUFFER =2048;
string output;
char fileInput [MAX_BUFFER];
// string input(istreambuf_iterator<char>(cin), {});
string input =" From fairest creatures we desire increase ,\
That thereby beauty's rose might never die,\
But as the riper should by time decease,\
His tender heir might bear his memory:\
But thou contracted to thine own bright eyes,\
Feed'st thy light's flame with self-substantial fuel,\
Making a famine where abundance lies,\
Thy self thy foe, to thy sweet self too cruel:\
Thou that art now the world's fresh ornament,\
And only herald to the gaudy spring,\
Within thine own bud buriest thy content,\
And tender churl mak'st waste in niggarding:\
Pity the world, or else this glutton be,\
To eat the world's due, by the grave and thee.\
When forty winters shall besiege thy brow,\
And dig deep trenches in thy beauty's field,\
Thy youth's proud livery so gazed on now,\
Will be a tattered weed of small worth held:\
Then being asked, where all thy beauty lies,\
Where all the treasure of thy lusty days;\
To say within thine own deep sunken eyes,\
Were an all-eating shame, and thriftless praise.\
How much more praise deserved thy beauty's use,\
If thou couldst answer 'This fair child of mine\
Shall sum my count, and make my old excuse";
string cmd_string = "/bin/bash -c grep -i \"the[^a-z0-9]\" $filename <<< "+input;
//cout<<cmd_string.c_str();
FILE *f=popen(cmd_string.c_str(),"r");
while (!feof(f))
{
if (fgets(fileInput, MAX_BUFFER, f) != NULL)
{
cout<<" line 1"<<fileInput[0];
output+=fileInput;
}
else
{
cout<<"f is null"<<endl;
}
}
pclose(f);
cout<< output;
return 0;
}
最佳答案
处理带参数的命令行标志的正常(并且几乎通用)约定是,命令行标志本身后面的单个参数是相关联的参数。后续参数是其他标志或位置参数。bash
确实如此.如果您想使用 -c
命令行标志来执行 bash 命令,整个命令需要是 -c
的参数标志,它必须是一个参数。后续参数分配给 $0
, $1
等命令执行之前。
所以如果你输入:
bash -c echo foo
bash -c 'echo $0' foo
foo
“正如预期的那样”(如果您的期望是经过精心磨练的),但这样做是正常的:
bash -c 'echo foo'
/bin/bash -c grep -i \"the[^a-z0-9]\" ...
grep
没有任何争论;
-i
和随后的参数分配给
$0
等,但由于这些从未被命令引用,这有点毫无意义。
/bin/bash -c 'grep -i "the[^a-z0-9]" ... '
<<<"...poem..."
) 必须是
-c
的一部分。论据
/bin/bash
而不是
popen
解释的命令行的一部分.
popen
用途
sh
执行提供的命令行,很有可能是
sh
无法识别“here-string”语法;这是一个 bash 扩展。因为
<<<
不是特别在
sh
,
<<
通常被解释为here-doc,后面必须跟一个分隔符字符串。后面不能跟
<
重定向;因此出现“意外重定向”错误。当您在
<<<
后面打字时很长,您显然在解析错误的重定向之前触发了“文件名太长”错误。这只是一个猜测;我没有重现问题。
"
没有问题。在单引号字符串中,但您必须反斜杠双引号以符合 C 字符串文字语法。不幸的是,字符串文字包含单引号,其中的第一个将被解析为在
bash -c '
中关闭单引号。 .并且无法对 bash 单引号字符串中的任何内容进行反斜杠转义,甚至单引号也不行。
'\''
表示每个 ' (在 C 字符串中需要为
'\\''
)。在该序列中,第一个和最后一个 ' 关闭并重新打开单引号字符串,以及
\'
中间是一个反斜杠转义的 '.
$filename
对您的命令无效,因为 $filename
从未被定义。如果它被定义,它会产生各种错误;因为它没有定义并且扩展没有被引用,它只是从命令行中消失了,但是首先不把它放在那里会容易得多。 grep
将是单行。我不认为那是你的意思。 <<<
后跟一个“词”;如果你不在它周围加上引号,你最终只会将第一个空格之前的部分视为输入。 关于c++ - 在 ubuntu 中使用/bin/bash 运行 grep 时,popen 错误重定向意外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32343591/
我有一个文件 test.log。非常大的日志文件。它有不同级别的日志记录。例如,trace , debug , info , warning和 error . 显然trace级别消息只是高速发送垃圾邮
我正在经历一些事情,发现了我无法理解的事情, grep -v grep 这意味着什么?我知道 -v 开关将选择所有不匹配的行。但为什么是第二个grep? 这是完整的命令: ps -ef | grep
我使用 egrep 输出一些带有平台名称的行: XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu
grep退出状态部分报告中的手册: EXIT STATUS The exit status is 0 if selected lines are found, and 1 if not
我试图返回多个字符串的第一次出现,即,我想从以下文本中选择第一次出现 1259、3009 和 1589 的行。 ADWN 1259 11:00 B23 ADWN 3009
我猜它不是 Perl 兼容的正则表达式,因为有一种特殊的 grep具体来说就是 PCRE。什么是grep最相似? grep有什么特别的怪癖吗?我需要知道什么? (我习惯了 Perl 和 PHP 中的
有没有办法让 grep 从与搜索表达式匹配的文件中输出“单词”? 如果我想在多个文件中查找“th”的所有实例,我可以这样做: grep "th" * 但是输出会是这样的(粗体是我写的); some-t
我有许多(近 100 个)大 csv 文件,第一列中有 sellID。我知道某些 sellID 在 2 个或更多文件中重复 2 次或多次。是否可以使用 grep 找到所有重复的 sellID(创建映射
我有一个文件中的文件列表。该列表很大,并且文件名是非标准的:这意味着有些文件包含空格、非 ASCII 字符、引号、单引号... 因此,将庞大的文件列表作为参数传递给 grep 并不是一种选择: 因为我
我想在 shell 脚本中使用 grep 和两个变量 var = match cat list.txt | while read word_from_list; do grep "$word_
我有一个大文件,其中每一行都包含一个子字符串,例如 ABC123。如果我执行 grep ABC file.txt 或 grep ABC1 file.txt 我按预期返回这些行,但如果我执行 grep
当我执行以下 grep 时,我得到的结果我无法向自己解释: host:/usr/local/tomcat > grep '-XX:PermSize=256m' * RELEASE-NOTES:
这个问题在这里已经有了答案: grep recursively for a specific file type on Linux (5 个回答) 关闭4年前。 要在子目录中查找所有带有 .out 扩
有什么方法可以让我在搜索某些东西时使用 grep 忽略某些文件,相当于 svnignore 或 gitignore 的东西?我通常在搜索源代码时使用类似的东西。 grep -r something *
有没有办法让 grep 从匹配搜索表达式的文件中输出“单词”? 如果我想在多个文件中找到“th”的所有实例,我可以这样做: grep "th" * 但是输出会是这样的(粗体是我的); some-tex
我是 awk/sed 的完全菜鸟,所以如果我在这里遗漏了一些明显的东西,请原谅我。 基本上我正在尝试做一个嵌套的 grep,即类似于: grep $value `exim -Mvh $(`exim -
我正在尝试编写下载 node.js source 的脚本和 corresponding SHASUMS256.txt ,校验和,grep OK,不返回任何结果,使用 grep 的 -q 标志成功退出代
在 grep "str"* 这是否意味着 grep 执行 grep 的所有内容? 那么 grep -r "str". 的结果比前一个多 最佳答案 当您运行 grep str * 时,shell 将扩展
我正在尝试 grep 文件以查找匹配项的确切出现,但我也得到了更长的虚假匹配项: grep CAT1717O99 myfile.txt -F -w 输出: CAT1717O99 CAT1717O99
我有一个文件,其中包含我希望通过未指定分析运行的标识符(每行一个)。如果一切运行正常,分析将输出具有相同标识符的另一个列表(不一定按相同顺序)。 然而,事实证明,对某些输入标识符没有进行分析,并且这些
我是一名优秀的程序员,十分优秀!