linux centos7 bash中字符串反向输出
给定一个字符串,如何反向(倒序)输出?
字符串反转的方法:a.对各个字符位置进行循环调换(从原字符串左边取出放在新字符串的右边;从原字符串右边取出放在新字符串的左边)。b.对各个字符由水平排列转为垂直排列(行变列),tac反转,再由垂直排列转为水平排列(列变行)。
由行变列的方法有:grep、sed、awk、xargs等。由列变行主要有sed、awk、tr等。
xargs只能把空格分隔的行转为列。可以通过sed、awk等方法为字符串各字符间添加空格。
训练项目很简单,解决方法也很多,我们共同讨论。
一、rev命令
该命令接受文件作参数,也接受标准输入。
1.基本语法
命令格式
rev [OPTION] [FILE...]
如果没有指定文件,则读取标准输入。
选项说明
-V, --version显示版本信息并退出
-h, --help显示帮助信息并退出
标准输入格式
echo "string" |rev
rev命令将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,最后一个字符最先输出,依次类推。
与其他命令结合时表示将其收到的其他命令执行的结果以字符串为单位进行倒序输出。
2.常用示例
给定文件rev_ test.txt 用于测试,内容如下:
abcde
12345
a.来自文件
反序显示文件的每行内容
rev rev_test.txt
edeba
54321
b.来自标准输入
反序显示从标准输入读取的内容
rev
hello
olleh
每输入一行内容后,键入回车将显示反序后的内容
键入 Ctrl + d 结束输入
标准输入的另一写法:
rev <<< $'12345'
rev <<< 12345
二、变量应用
把给定字符串定义为一个变量,利用其特性,反向输出:
var="ABCD";len=${#var};for((i=$len;i>=0;i--)); do echo -e "${var:$i:1}\c";done;echo
len=${#var} # 获取字符串长度
echo -e "${var:$i:1}\c"中-e是开启转义 \c取消echo的换行
三、sed命令
1.替换字符间分隔符
把每个字符后添加一个换行符,通过tac反转,再把多行转为单行(不能有空格)
PS:
a.应用sed为字符串间添加空格
sed 's/./& /g' filename
b.应用sed把字符串转行为列
sed 's/./&\n/g' filename
c.应用sed把字符串转列为行
sed ':a;$!N;s/\n//g;ba' filename
sed ':a;N;s/\n//g;ta' filename
2.分组反向引用
echo 'ABC'|sed 's/\(.\)\(.\)\(.\)\/\3\2\1/g'
echo 'ABC'|sed -r 's/(.)(.)(.)/\3\2\1/'
(.) 正则表达式中的分组匹配,匹配之后再用具体位置参数 \4\3\2\1来实现反转
-r 使用-r参数,表示扩展正则表达式,就不用使用\来进行转义
3.普通方法
a.应用G D s
echo '123456789'|sed -r '/\n/!G;s/(.)(.*\n)/&\2\1/;//D;s/.//'
b.应用x H s
echo 123456|sed $'s/./&\\\n/g' | sed -ne $'x;H;${x;s/\\n//g;p;}'
工作原理是首先将输入字符串分成每个字符一行,然后将每个字符插入保持缓冲区的开头。
x交换保持空间和模式空间,并且 H将(当前)模式空间附加到保持空间。
因此,对于每个角色,我们将该角色放入保持空间,然后将旧的保持空间附加到其中,从而反转输入。最后一个命令删除换行符以重建原始字符串。
c.应用 G h s
echo abcdefgh|sed 's/./&\n/g'|sed -n $'1!G;h;$!d;s/\\n//g;p'
熟悉应用sed命令使用文件倒序输出的,对此命令较易理解。参考文章:linux centos7文件倒序与功能实现
不加-n选项,不加p操作
四、awk命令
1.设置分隔符方法
通过设置内置变量FS、OFS及ORS,达到反向输出
2.应用子串截取方法
echo ABCD|awk '{for(i=1;i<=length;i++) {line=substr($0,i,1) line}} END{print line}'
a.substr($0,i,1)表示取当前字符从索引i开始,取当前位
b.length 为当前字符串的长度
c.line=substr($0,i,1) line将三个值分别保存在内存栈中
3.设置分隔符方法
echo "dsfedw" | awk 'BEGIN{FS = ""}{for(i = NF; i >= 1; i--) {printf("%s", $i)}{printf("\n")}}'
wdefsd ## 反向输出
五、常用命令组合
把常用命令进行简单的组合,可以达到反转字符串。
各种命令组合将产生较多方法,我们仅介绍一部分。
1.grep
echo '!!!esreveR si sihT' | grep -o . | tac | tr -d '\n' ; echo
2.fold
echo '!!!esreveR si sihT'|fold -w 1|tac|tr -d '\n';echo
3.xxd
转换为十六进制值然后反转
echo '!!!esreveR si sihT' | xxd -p | grep -o .. | tac | xxd -r -p echo
4.tr
tr命令可以设置选项-d '',"\n"。
六、Python
echo ABCD|python -c 'print raw_input()[::-1]'
1.[::-1] 实现字符串的反转
2.-c commond 表示运行时以命令性字符串提交python脚本
3.raw_input() 将管道传过来的值作为字符串输入
七、perl
echo ABCD | perl -nle 'print scalar reverse $_'
1.print scalar reverse $_ 将管道传过来的字符串传到默认标量$_,再用reverse取反
2.-e让Perl程序可以在Perl命令行中运行,比如: perl -e 'print "Hello,World!\n"'
3.-n增加了循环功能,可以一行行处理文本
4.-l用来给每行增加一个换行符"\n"
八、bash实现
linux 中bash实现字符串的反向输出方法很多,仅介绍部分。
1. 字符右切片方法
#!/bin/bash
#guo 2023.8.26
#使用read读入一段字符串,最后以倒序的方式打印出这一段字符串
echo -e "\e[33;1mQuit program when input is empty.\e[m" # 前面的“\e[33;1m”和后面的“\e[m”为一组,设置文字颜色
while :
do
read -p "Please input a string: " str
if [ "$str" = "" ];then # 当什么都不输的时候则退出程序
echo "bye~"
exit
fi
len=${#str} # 获得输入的字符长度
res="" # 清空字符串变量
for ((i=$len;i>=0;i--))
do
res=$res${str:$i:1} # 利用字符切片从后往前一次取出一个字符并连接
done
echo "$res"
done
本方法是利用字符切片从后往前依次取出一个字符并组合成一新的字符串。最后直接输出这个新的字符串。
2.字符左切片方法
#!/bin/bash
#guo 2023.8.26
#使用read读入一段字符串,最后以倒序的方式打印
echo -e "\033[32;1mPlease enter 'q' to exit the program.\033[m"
var="12345"
rev=""
for (( i=0 ; i<${#var} ; i++ )); do rev="${var:i:1}$rev"; done
echo "var: $var, rev: $rev"
3.REPLY方法
echo ABCD | { read; for((i=${#REPLY};i>0;i--)) do echo -n ${REPLY:i-1:1};done;echo; }
本方法未提前设置变量,直接利用REPLY处理(已将变量的值从标准输入读到REPLY)。
$REPLY:当没有参数变量提供给read命令的时候,这个变量会作为默认变量提供给read命令。
小结
字符串反向输出是每一种高级语言都涉及到的重要操作。这是检验高级语言处理基本问题的常用功能是否健壮,处理手法是否灵活多样。
一个简单的字符串反向输出关注的知识点包括:循环结构、分支结构,从此案例引导的命令学习,是对grep、sed、awk、tr、tac和变量的深入理解与灵活应用。
相关文章:

linux centos7 bash中字符串反向输出
给定一个字符串,如何反向(倒序)输出? 字符串反转的方法:a.对各个字符位置进行循环调换(从原字符串左边取出放在新字符串的右边;从原字符串右边取出放在新字符串的左边)。b.对各个字符由水平排列转为垂直排…...

git rebase和merge区别
一、概述 merge和rebase 标题上的两个命令:merge和rebase都是用来合并分支的。 这里不解释rebase命令,以及两个命令的原理,详细解释参考这里。 下面的内容主要说的是两者在实际操作中的区别。 1.1 什么是分支 分支就是便于多人在同一项目…...

Vue插槽实现商品列表-编辑渲染
商品列表 文章目录 商品列表核心步骤创建组件 1. MyTag组件详细步骤双击显示,自动聚焦失去焦点,隐藏输入框回显标签信息回车修修改内容,同时隐藏输入框 MyTable组件详细步骤1-动态的设置整个表格的数据 : props2-实现自定义结构-插…...
Vue开发之父子组件
创建父子组建,分三步。一是创建文件,二是引入组建,三是组件间通信。在components目录下新建sub文件夹,用于存放一下可以复用的子组件。比如新建一个SubCon.vue组件 <template><div class"first-app">{{ ms…...

fastadmin think-queue supervisor配置
起因是微信支付回调需要同时做发货处理,但是发货接口不能影响,需要队列进行异步处理1. 1.fastadmin 后台购买queue插件(基于think-queue消息队列) 2.代码 2.1 添加文件:application---->extra--->queue.php 内容:我这里用的数据库做…...

STM32 进不了main 函数
1. 我用的是STM32L151C8T6 的芯片,在github 上找了个别人的例程,拿来当模板改,由于他用的是HSE 外部晶振,我用的是内部晶振HSI,所以需要改系统时钟,改完后debug, 一直进不了main 函数࿰…...

不用循环数组,js+html实现贪吃蛇
功能描述:每走10步随机改变一个方方向,当键盘按下方向键 w,s,a,d时,使用键盘方向控制蛇的移动,蛇头每撞到一次自身时改变屏幕颜色,蛇头碰到边界时从另一边回来。 实现思路:用个30大小的数组存放每个结点&a…...
什么是线程安全和线程不安全?
线程安全(Thread Safety)和线程不安全(Thread Unsafety)是与并发编程相关的概念,特别是在多线程环境中使用共享资源时会涉及到这些概念。 线程安全: 当多个线程同时访问共享资源时,如果在没有额外的同步措施的情况下,这些线程仍然能够正确地执行并保持数据的一致性,那…...

VUE笔记(十)Echarts
一、Echarts简介 1、什么是echarts ECharts是一款基个基于 JavaScript 的开源可视化图表库 官网地址:Apache ECharts 国内镜像:ISQQW.COM x ECharts 文档(国内同步镜像) - 配置项 示例:echarts图表集 2、第一个E…...

FPGA原理与结构——时钟IP核原理学习
一、前言 在之前的文章中,我们介绍了FPGA的时钟结构 FPGA原理与结构——时钟资源https://blog.csdn.net/apple_53311083/article/details/132307564?spm1001.2014.3001.5502 在本文中我们将学习xilinx系列的FPGA所提供的时钟IP核,来帮助我们进一…...

创建python环境——Anaconda
在Windows中安装Anaconda和简单使用 一.Anaconda发行概述 Anaconda是一个可以便捷获取和管理包,同时对环境进行统一管理的发行版本,它包含了conda、 Python在内的超过180个科学包及其依赖项。 1.Anaconda发行版本具有以下特点: (1)包含了…...

使用Linux部署Kafka教程
目录 一、部署Zookeeper 1 拉取Zookeeper镜像 2 运行Zookeeper 二、部署Kafka 1 拉取Kafka镜像 2 运行Kafka 三、验证是否部署成功 1 进入到kafka容器中 2 创建topic 生产者 3 生产者发送消息 4 消费者消费消息 四、搭建kafka管理平台 五、SpringBoot整合Kafka 1…...

pyechart笔记:opts.AxisOpts
定制化图表的轴线(x轴和y轴)的样式和设置 0 不设置坐标轴 c1(Bar().add_xaxis([力量,智力,敏捷]).add_yaxis(全能骑士,# 系列名称,用于 tooltip 的显示,legend 的图例筛选。[429,321,296],#系列数据).add_yaxis(猴子,[352,236,4…...
深度思考rpc框架面经之五:rpc熔断限流、rpc复用连接机制
11 RPC框架如何实现限流和熔断 推荐文章:RPC实现原理之核心技术-限流熔断 11.1 为什么Dubbo要做服务的限流?(根本原因是服务端进行自我保护) 限流是一种常见的系统保护手段。在分布式系统和微服务架构中,一个接口的过度使用可能会导致资源…...
Go 数组
数组用于在单个变量中存储相同类型的多个值,而不是为每个值声明单独的变量。 声明数组 在Go中,有两种声明数组的方式: 使用var关键字: 语法 var array_name [length]datatype{values} // 这里定义了长度 或者 var array_n…...

04架构管理之分支管理实践-一种git分支管理最佳实践
专栏说明:针对于企业的架构管理岗位,分享架构管理岗位的职责,工作内容,指导架构师如何完成架构管理工作,完成架构师到架构管理者的转变。计划以10篇博客阐述清楚架构管理工作,专栏名称:架构管理…...

D.OASIS City 和 Warrix 在The Sandbox 庆祝 Rise of the 10th Legend十周年
D.OASIS 首次展示了变革性娱乐 D.OASIS City,正如它与 WARRIX 一起承诺的那样。WARRIX 是获得泰国国家队球衣生产授权的标志性运动服装品牌。 这款激动人心的游戏冒险游戏于今天推出,让用户能够投入 D.OASIS City x WARRIX:Rise of the 10th…...

Git基本操作(Idea版)
第一次发布项目(本地->远程) 方式一 通过push的方式推送本地库到远程库(远程已创建好仓库) 这种方式需要提前创建好仓库。 右键点击项目,可以将当前分支的内容 push 到 GitHub 的远程仓库中。 注意:…...

NSS [羊城杯 2020]easyser
NSS [羊城杯 2020]easyser 开题。很容易让人觉得环境坏了。 不要慌,无从下手时。看源码、扫目录、抓包。一套操作下来,发现几个可以下手的路由。 /index.php /robots.txt 访问 /star1.php,一说到百度,就猜测是否存在SSRF。 源码中…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...