程序批量將文本文件中的某字符替換
阿新 • • 發佈:2018-03-03
log argc pri 思路 strcmp sprintf true 軟件 調用
【需求場景】
之前的shell腳本中配寄存器調用的是./ads w <devsel> <reg> <val>,現在工具換了,工具名和參數以及使用方式都變了,變成了echo "<devsel> <reg> <val>" > /sys/class/ti-spi/ads/write。但是,之前寫的那些腳本散落在各個目錄下手動一行行改太費勁了,就算有notpad++這類支持列編輯模式的軟件,改起來也得一天,還易錯,更重要的是,手疼!於是乎,想到了寫個程序幹這件事,程序員嘛,就要有這種懶惰的智慧。
【思路原理】
一切皆文件,我把它一行行讀回來,查找當前行中有沒有要替換的,有則把它摳掉,剩余的再前接一個後接一個。但這裏還需要註意,原shell腳本中字符串之間的空格個數不盡相同,有的甚至使用tab鍵,如果生硬的搜索某個定死的長串,則不能做到很好的兼容性。
【代碼】
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LINE 1024 /* 將字符串腰斬 */ char *strncpy_waist(char *str, int offset, int len) { int i=0; for (i=0;i<len;i++) { *(str + i) = *(str + i + offset); } while (*(str + i)) { *(str + i) = ‘\0‘; i++; } printf("%s", str); return str; }
/* 這種做法就不能做到對空格的兼容性 */ int ReadData1(FILE *fp, char *buf, char *child) { char *ret = fgets(buf, LINE, fp);//?????buf if (ret == NULL ) { return -1; } int len = strlen(child); int len1 = strlen(buf); if ( 0 == strncmp(buf,child, len) ) { strncpy_waist(buf,len,len1 - len); return 0; } else { return 1; } } void someprocess1(char *buf, char *before, char *after) { char buf1[LINE]={0}; int len = strlen(buf); strncpy(buf1,buf,len-1); sprintf(buf, "%s %s %s" , before, buf1, after); } int ReadData(FILE *fp, char *buf, char *child) { char *ret = fgets(buf, LINE, fp);//?????buf if (ret == NULL ) { return -1; } char sample1[20]={0}; char sample2[20]={0}; char cur1[20]={0}; char cur2[20]={0}; char buf1[LINE]={0}; strcpy(buf1,buf); memset(buf,0,strlen(buf)+1); sscanf(child,"%s%s",sample1,sample2); sscanf(buf1,"%s%s",cur1,cur2); if ( 0 == strcmp(sample1,cur1) && 0 == strcmp(sample2,cur2) ) { sscanf(buf1,"%*s%*s%[^\n]",buf); return 0; } else { strcpy(buf,buf1); return 1; } } void someprocess(char *buf, char *before, char *after) { char buf1[LINE]={0}; strcpy(buf1,buf); sprintf(buf, "%s %s %s\n" , before, buf1, after); } int write_into_new(FILE *fp, char *buf) { int len = strlen(buf) + 1; fwrite(buf,len,1,fp ); return 0; } int main(int argc, char* argv[]) { FILE *fp, *fp_new; char *buf, filename_new[20]={0}; int p; sprintf(filename_new, "%s_xxg", argv[1]); if ((fp=fopen(argv[1], "r"))==NULL) { printf("open file error!!\n"); return -1; } if ((fp_new=fopen(filename_new, "w"))==NULL) { printf("create file error!!\n"); return -1; } buf=(char*)malloc(LINE*sizeof(char)); while(1) { p=ReadData(fp, buf, "./ads w");// if(p == -1)//到文件結尾了 break; if(p == 0) { someprocess(buf, argv[2], argv[3]); } write_into_new(fp_new, buf); } return 0; }
程序批量將文本文件中的某字符替換