程序批量将文本文件中的某字符替换

Posted 云鹤比天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序批量将文本文件中的某字符替换相关的知识,希望对你有一定的参考价值。

【需求场景】

之前的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; }

 

  

 

以上是关于程序批量将文本文件中的某字符替换的主要内容,如果未能解决你的问题,请参考以下文章

linux系统批量替换文件中的字符

shell脚本替换文本内容

在java中如何修改文本文件中的某一行的某些数据??

python将指定文本中的字符串替换后,生成新的文本文件。

intellij idea有没有像eclipse的全局替换文本,因为我替换所有类中的某一个名称的代码

Linux批量替换文本,文件夹内所有文本内容