首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从单独的输入行(从文件或标准输入)格式化bash命令行

从单独的输入行(从文件或标准输入)格式化bash命令行的方法有多种。下面是一种常见的方法:

  1. 首先,读取输入行。如果是从文件中读取,可以使用文件读取函数,如fopenfread。如果是从标准输入读取,可以使用fgets函数。
  2. 对于每一行输入,进行以下处理:
  3. a. 去除行首和行尾的空格和换行符,可以使用字符串处理函数,如trim
  4. b. 检查行是否为空行,如果是则跳过。
  5. c. 检查行是否以注释符号#开头,如果是则跳过。
  6. d. 将行按照空格或制表符进行分割,可以使用字符串处理函数,如strtok
  7. e. 对于每个分割后的单词,进行以下处理:
    • 如果单词以$开头,表示是一个变量,可以使用字符串处理函数,如strstrstrchr,找到变量名,并替换为对应的值。
    • 如果单词以'"开头,表示是一个字符串,可以使用字符串处理函数,如strchr,找到字符串的结束位置,并将整个字符串替换为对应的值。
    • 如果单词以#开头,表示是一个注释,可以将该单词及其后面的内容都忽略。
    • f. 将处理后的单词重新组合成一行命令,可以使用字符串处理函数,如strcatsprintf
  • 输出格式化后的命令行。

下面是一个示例代码,演示如何实现上述步骤:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LINE_LENGTH 1024

char* trim(char* str) {
    char* end;

    // 去除行尾的空格和换行符
    end = str + strlen(str) - 1;
    while (end > str && (*end == ' ' || *end == '\n')) {
        *end = '\0';
        end--;
    }

    // 去除行首的空格
    while (*str == ' ') {
        str++;
    }

    return str;
}

void formatCommand(char* line) {
    char* token;
    char* command = malloc(MAX_LINE_LENGTH);
    command[0] = '\0';

    // 分割行为单词
    token = strtok(line, " \t");
    while (token != NULL) {
        // 处理变量
        if (token[0] == '$') {
            // 替换为对应的值
            char* value = getenv(token + 1);
            if (value != NULL) {
                strcat(command, value);
            }
        }
        // 处理字符串
        else if (token[0] == '\'' || token[0] == '\"') {
            // 找到字符串的结束位置
            char* end = strchr(token + 1, token[0]);
            if (end != NULL) {
                // 替换为对应的值
                strncat(command, token + 1, end - token - 1);
            }
        }
        // 处理注释
        else if (token[0] == '#') {
            // 忽略注释及其后面的内容
            break;
        }
        // 处理普通单词
        else {
            strcat(command, token);
        }

        strcat(command, " ");
        token = strtok(NULL, " \t");
    }

    printf("%s\n", trim(command));
    free(command);
}

int main() {
    char line[MAX_LINE_LENGTH];

    // 从标准输入读取输入行
    while (fgets(line, sizeof(line), stdin) != NULL) {
        formatCommand(line);
    }

    return 0;
}

这个示例代码可以从标准输入读取输入行,并将格式化后的命令行输出到标准输出。你可以将输入行写入一个文件,然后通过重定向将文件内容作为标准输入,从而实现从文件中读取输入行的功能。

这个方法可以帮助你将输入行中的变量和字符串替换为对应的值,并去除注释和多余的空格,从而得到格式化后的bash命令行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c语言基础学习06_函数

============================================================================= 涉及到的知识点有:1、C语言库函数、字符输入函数:gets和fgets、字符输出函数:puts和fputs、 求字符串长度函数strlen、字符串追加函数strcat、字符串有限追加函数strncat、字符串比较函数strcmp、 字符串有限比较函数strcmp、字符串拷贝函数strcpy、字符串有限拷贝函数strncpy、 格式化字符串函数sprintf(输出)、格式化字符串函数sscanf(读取输入)、解析一个字符串、 字符串查找字符函数strchr、字符串查找子串函数strstr、字符串分割函数strtok、 atoi函数、atof函数、atol函数、解析一个字符串的高级应用。 2、函数的定义和声明、函数的形式参数(形参)与实际参数(实参)、函数的返回值类型和返回值、 return函数与exit函数(exit更猛,不受位置限制)、自定义一个函数,实现大小写字母的互相转换功能、 自定义一个函数,实现atoi的功能。 3、函数的递归、递归例子:有n个人排成一队、递归例子:将10进制数转化为二进制数、 递归例子:将10进制数转化为16进制、递归例子:菲波那切数列、递归的优点与缺点。 4、多个源代码文件程序如何编译、头文件的使用、解决预编译时会出现多次函数声明问题。 ============================================================================= C语言库函数

02

C/C++语言 常用头文件及函数

#include <assert.h>    //设定插入点 #include <ctype.h>     //字符处理 #include <errno.h>     //定义错误码 #include <float.h>     //浮点数处理 #include <iso646.h> //对应各种运算符的宏 #include <limits.h>    //定义各种数据类型最值的常量 #include <locale.h>    //定义本地化C函数 #include <math.h>     //定义数学函数 #include <setjmp.h> //异常处理支持 #include <signal.h> //信号机制支持 #include <stdarg.h> //不定参数列表支持 #include <stddef.h> //常用常量 #include <stdio.h>     //定义输入/输出函数 #include <stdlib.h>    //定义杂项函数及内存分配函数 #include <string.h>    //字符串处理 #include <time.h>     //定义关于时间的函数 #include <wchar.h>     //宽字符处理及输入/输出 #include <wctype.h>    //宽字符分类

00

c/c++中宽窄字符串函数对应关系

宽字符函数  普通C函数  描述  iswalnum()  isalnum()  测试字符是否为数字或字母  iswalpha()  isalpha()  测试字符是否是字母  iswcntrl()  iscntrl()  测试字符是否是控制符  iswdigit()  isdigit()  测试字符是否为数字  iswgraph()  isgraph()  测试字符是否是可见字符  iswlower()  islower()  测试字符是否是小写字符  iswprint()  isprint()  测试字符是否是可打印字符  iswpunct()  ispunct()  测试字符是否是标点符号  iswspace()  isspace()  测试字符是否是空白符号  iswupper()  isupper()  测试字符是否是大写字符  iswxdigit()  isxdigit()  测试字符是否是十六进制的数字

00

C语言函数小集合

一、字符操作 函数名: fputc 功 能: 送一个字符到一个流中 用 法: int fputc(int ch, FILE *stream); 函数名: fputs 功 能: 送一个字符串到一个流中 用 法: int fputs(char *string, FILE *stream); 函数名: sprintf 功 能: 输出数据到一字符串中(而printf是输出到屏幕上) 函数名: fread 用 法: fread(fa,4,5,fp); 功 能: 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中 函数名: strncmp 用 法: extern int strncmp(char *s1, char *s2, int n); 功 能: 比较字符串s1和s2的前n个字符。 详 细: 逐次比较两个字符串前n个字符中的每一个字符(用第一个字符串的字符的ASCII值减去第二个字符串的相应字符的ASCII值),如果相等则继续比较下一个;如果不等,ASCII的差值就是返回值。 函数名: isalnum 原型:extern int isalnum(int c); 用法:#include <ctype.h>  功能:判断字符c是否为字母或数字  说明:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零。 函数名: isalpha 原型:extern int isalpha(int c); 用法:#include <ctype.h> 功能:判断字符c是否为英文字母 说明:当c为英文字母a-z或A-Z时,返回非零值,否则返回零。 函数名: iscntrl 原型:extern int iscntrl(int c); 用法:#include <ctype.h> 功能:判断字符c是否为控制字符 说明:当c在0x00-0x1F之间或等于0x7F(DEL)时,返回非零值,否则返回零。 函数名: isdigit 原型:extern int isdigit(int c); 用法:#include <ctype.h> 功能:判断字符c是否为数字 说明:当c为数字0-9时,返回非零值,否则返回零。 函数名: islower 原型:extern int islower(int c); 用法:#include <ctype.h> 功能:判断字符c是否为小写英文字母 说明:当c为小写英文字母(a-z)时,返回非零值,否则返回零。 函数名: isascii 原型:extern int isascii(int c); 用法:#include <ctype.h> 功能:判断字符c是否为ascii码 说明:当c为ascii码时,返回非零值,否则返回零。ascii码指0x00-0x7F之间的字符 函数名: isgraph 原型:extern int isgraph(int c); 用法:#include <ctype.h> 功能:判断字符c是否为除空格外的可打印字符 说明:当c为可打印字符(0x21-0x7e)时,返回非零值,否则返回零。 函数名: isprint 原型:extern int isprint(int c); 用法:#include <ctype.h> 功能:判断字符c是否为可打印字符(含空格) 说明:当c为可打印字符(0x20-0x7e)时,返回非零值,否则返回零。 函数名: ispunct 原型:extern int ispunct(int c); 用法:#include <ctype.h> 功能:判断字符c是否为标点符号 说明:当c为标点符号时,返回非零值,否则返回零。 标点符号指那些既不是字母数字,也不是空格的可打印字符。 函数名: isspace 原型:extern int isspace(int c); 用法:#include <ctype.h> 功能:判断字符c是否为空白符 说明:当c为空白符时,返回非零值,否则返回零。 空白符指空格、水平制表、垂直制表、换页、回车和换行符。 函数名: isupper 原型:extern int isupper(int c);  用法:#include <ctype.h>  功能:判断字符c是否为大写英文字母 说明:当c为大写英文字母(A-Z)时,返回非零值,否则返回零。 函数名: isxdigit 原型:extern int isxdigit(int c); 用法:#include <ctype.h> 功能:判断字符c是否为十六进制数字 说明:当c为A-F,a-f或0-9之间的十六进制数字时,返回非零值,否则返回零。 函数名: toascii 原型:extern int toascii(int c);

02
领券