当前位置: 首页 > news >正文

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中字符串反向输出

给定一个字符串&#xff0c;如何反向(倒序)输出&#xff1f; 字符串反转的方法&#xff1a;a.对各个字符位置进行循环调换&#xff08;从原字符串左边取出放在新字符串的右边&#xff1b;从原字符串右边取出放在新字符串的左边&#xff09;。b.对各个字符由水平排列转为垂直排…...

c++:QT day1 认识与学习

...

git rebase和merge区别

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

Vue插槽实现商品列表-编辑渲染

商品列表 文章目录 商品列表核心步骤创建组件 1. MyTag组件详细步骤双击显示&#xff0c;自动聚焦失去焦点&#xff0c;隐藏输入框回显标签信息回车修修改内容&#xff0c;同时隐藏输入框 MyTable组件详细步骤1-动态的设置整个表格的数据 &#xff1a; props2-实现自定义结构-插…...

Vue开发之父子组件

创建父子组建&#xff0c;分三步。一是创建文件&#xff0c;二是引入组建&#xff0c;三是组件间通信。在components目录下新建sub文件夹&#xff0c;用于存放一下可以复用的子组件。比如新建一个SubCon.vue组件 <template><div class"first-app">{{ ms…...

fastadmin think-queue supervisor配置

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

STM32 进不了main 函数

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

不用循环数组,js+html实现贪吃蛇

功能描述&#xff1a;每走10步随机改变一个方方向&#xff0c;当键盘按下方向键 w,s,a,d时&#xff0c;使用键盘方向控制蛇的移动&#xff0c;蛇头每撞到一次自身时改变屏幕颜色&#xff0c;蛇头碰到边界时从另一边回来。 实现思路&#xff1a;用个30大小的数组存放每个结点&a…...

什么是线程安全和线程不安全?

线程安全(Thread Safety)和线程不安全(Thread Unsafety)是与并发编程相关的概念,特别是在多线程环境中使用共享资源时会涉及到这些概念。 线程安全: 当多个线程同时访问共享资源时,如果在没有额外的同步措施的情况下,这些线程仍然能够正确地执行并保持数据的一致性,那…...

VUE笔记(十)Echarts

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

FPGA原理与结构——时钟IP核原理学习

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

创建python环境——Anaconda

在Windows中安装Anaconda和简单使用 一.Anaconda发行概述 Anaconda是一个可以便捷获取和管理包&#xff0c;同时对环境进行统一管理的发行版本&#xff0c;它包含了conda、 Python在内的超过180个科学包及其依赖项。 1.Anaconda发行版本具有以下特点&#xff1a; (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

定制化图表的轴线&#xff08;x轴和y轴&#xff09;的样式和设置 0 不设置坐标轴 c1(Bar().add_xaxis([力量,智力,敏捷]).add_yaxis(全能骑士,# 系列名称&#xff0c;用于 tooltip 的显示&#xff0c;legend 的图例筛选。[429,321,296],#系列数据).add_yaxis(猴子,[352,236,4…...

深度思考rpc框架面经之五:rpc熔断限流、rpc复用连接机制

11 RPC框架如何实现限流和熔断 推荐文章&#xff1a;RPC实现原理之核心技术-限流熔断 11.1 为什么Dubbo要做服务的限流&#xff1f;(根本原因是服务端进行自我保护) 限流是一种常见的系统保护手段。在分布式系统和微服务架构中&#xff0c;一个接口的过度使用可能会导致资源…...

Go 数组

数组用于在单个变量中存储相同类型的多个值&#xff0c;而不是为每个值声明单独的变量。 声明数组 在Go中&#xff0c;有两种声明数组的方式&#xff1a; 使用var关键字&#xff1a; 语法 var array_name [length]datatype{values} // 这里定义了长度 或者 var array_n…...

04架构管理之分支管理实践-一种git分支管理最佳实践

专栏说明&#xff1a;针对于企业的架构管理岗位&#xff0c;分享架构管理岗位的职责&#xff0c;工作内容&#xff0c;指导架构师如何完成架构管理工作&#xff0c;完成架构师到架构管理者的转变。计划以10篇博客阐述清楚架构管理工作&#xff0c;专栏名称&#xff1a;架构管理…...

D.OASIS City 和 Warrix 在The Sandbox 庆祝 Rise of the 10th Legend十周年

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

Git基本操作(Idea版)

第一次发布项目&#xff08;本地->远程&#xff09; 方式一 通过push的方式推送本地库到远程库&#xff08;远程已创建好仓库&#xff09; 这种方式需要提前创建好仓库。 右键点击项目&#xff0c;可以将当前分支的内容 push 到 GitHub 的远程仓库中。 注意&#xff1a…...

NSS [羊城杯 2020]easyser

NSS [羊城杯 2020]easyser 开题。很容易让人觉得环境坏了。 不要慌&#xff0c;无从下手时。看源码、扫目录、抓包。一套操作下来&#xff0c;发现几个可以下手的路由。 /index.php /robots.txt 访问 /star1.php&#xff0c;一说到百度&#xff0c;就猜测是否存在SSRF。 源码中…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...