linux去掉最后一个字符或第一个字符

linux去掉最后一个字符或第一个字符

参考地址:“https://www.jb51.cc/shell/4163831.html

1️⃣ 去除最后一个字符

[root@centos7 test]# cat a.txt
i e s m u
w e i p q
x z u n k
e c b v y
[root@centos7 test]# sed 's/.$//' a.txt
i e s m
w e i p
x z u n
e c b v

2️⃣ 去除最后一个字符

[root@centos7 test]# cat a.txt
i e s m u
w e i p q
x z u n k
e c b v y
[root@centos7 test]# awk '{sub(/.$/,"")}1' a.txt
i e s m
w e i p
x z u n
e c b v

3️⃣ 去除最后一个字符

[root@centos7 test]# cat a.txt
i e s m u
w e i p q
x z u n k
e c b v y
[root@centos7 test]# awk '{printf $0 "\b \n"}' a.txt
i e s m
w e i p
x z u n
e c b v

4️⃣ 去除最后一个字符

[root@centos7 test]# va=abcde
[root@centos7 test]# echo $va
abcde
[root@centos7 test]# echo ${va%?}
abcd

5️⃣ 去除第一个字符

[root@centos7 test]# cat a.txt
i e s m u
w e i p q
x z u n k
e c b v y
[root@centos7 test]# awk '{print substr($0,2)}' a.txt
 e s m u
 e i p q
 z u n k
 c b v y

6️⃣ 去除第一个字符

[root@centos7 test]# cat a.txt
i e s m u
w e i p q
x z u n k
e c b v y
[root@centos7 test]# sed 's/^.//' a.txt
 e s m u
 e i p q
 z u n k
 c b v y

 
 
 
 
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要允许用户使用管道操作符“|”来同时执行两个进程,并把第一个进程的stdout重定向为第二个进程的stdin,你可以按照以下步骤进行: 1. 读取用户的输入,使用C语言中的fgets函数读取用户的输入,并将其存储在一个字符数组中。 2. 解析用户的输入,使用C语言中的strtok函数将用户输入的命令和参数分离开来。如果用户输入了管道操作符“|”,则将命令和参数分别存储在两个数组中。 3. 创建一个管道,使用C语言中的pipe函数创建一个管道,以便将第一个进程的stdout重定向为第二个进程的stdin。 4. 创建两个子进程,分别执行用户输入的两个命令,使用C语言中的fork函数创建两个子进程,并使用C语言中的exec函数执行用户输入的命令。在第一个子进程中,将stdout重定向到管道的写入端;在第二个子进程中,将stdin重定向到管道的读取端。 5. 关闭管道和子进程,等待子进程结束,关闭管道的读取和写入端。 下面是一个简单的示例代码: ``` #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main() { char input[100]; char *command1, *command2; char *args1[10], *args2[10]; int i, pipefd[2]; while (1) { // 读取用户输入 printf("myshell> "); fgets(input, sizeof(input), stdin); // 去掉输入字符最后的换行符 input[strlen(input) - 1] = '\0'; // 解析用户输入 command1 = strtok(input, " "); args1[0] = command1; for (i = 1; i < 10 && (args1[i] = strtok(NULL, " ")) != NULL; i++); if ((command2 = strtok(NULL, " ")) != NULL && strcmp(command2, "|") == 0) { args1[i-1] = NULL; command2 = strtok(NULL, " "); args2[0] = command2; for (i = 1; i < 10 && (args2[i] = strtok(NULL, " ")) != NULL; i++); args2[i] = NULL; } else { args1[i] = NULL; args2[0] = NULL; } // 创建管道 pipe(pipefd); // 创建第一个子进程 pid_t pid1 = fork(); if (pid1 == 0) { // 将stdout重定向到管道的写入端 dup2(pipefd[1], STDOUT_FILENO); close(pipefd[0]); close(pipefd[1]); // 执行第一个命令 execvp(command1, args1); perror("execvp"); exit(EXIT_FAILURE); } // 创建第二个子进程 pid_t pid2 = fork(); if (pid2 == 0) { // 将stdin重定向到管道的读取端 dup2(pipefd[0], STDIN_FILENO); close(pipefd[0]); close(pipefd[1]); // 执行第二个命令 execvp(command2, args2); perror("execvp"); exit(EXIT_FAILURE); } // 关闭管道 close(pipefd[0]); close(pipefd[1]); // 等待子进程结束 waitpid(pid1, NULL, 0); waitpid(pid2, NULL, 0); } return 0; } ``` 当用户输入命令时,如果包含管道操作符“|”,则程序会创建管道并创建两个子进程分别执行两个命令,并将第一个进程的stdout重定向到管道的写入端,将第二个进程的stdin重定向到管道的读取端。否则,程序会创建一个子进程执行该命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值