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和变量的深入理解与灵活应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/100821.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比

时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-SSA-LSTM、EEMD-LSTM、SSA-LSTM、LSTM时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现EEMD-SSA-LSTM、E…

渗透测试漏洞原理之---【失效的访问控制】

文章目录 1、失效的访问控制1.1、OWASP Top 101.1.1、A5:2017-Broken Access Control1.1.2、A01:2021 – Broken Access Control 1.2、失效的访问控制类别1.2.1、水平越权1.2.2、垂直越权 1.3、攻防案例1.3.1、Pikachu靶场 Over Permision1.3.2、DVWA越权利用失效的访问控制漏洞…

大数据课程K16——Spark的梯度下降法

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解Spark的梯度下降法&#xff1b; ⚪ 了解Spark的梯度下降法家族&#xff08;BGD&#xff0c;SGD&#xff0c;MBGD&#xff09;&#xff1b; ⚪ 掌握Spark的MLlib实现…

Data Rescue Professional for Mac:专业的数据恢复工具

在数字化时代&#xff0c;我们的生活和工作离不开电脑和存储设备。但是&#xff0c;意外情况时常发生&#xff0c;例如误删除文件、格式化硬盘、病毒攻击等&#xff0c;这些都可能导致重要的数据丢失。面对数据丢失&#xff0c;我们迫切需要一款可靠的数据恢复工具。今天&#…

剪枝基础与实战(5): 剪枝代码详解

对模型进行剪枝,我们只对有参数的层进行剪枝,我们基于BatchNorm2d对通道重要度 γ \gamma γ参数进行稀释训练。对BatchNorm2d及它的前后层也需要进行剪枝。主要针对有参数的层:Conv2d、BatchNorm2d、Linear。但是我们不会对Pool2d 层进行剪枝,因为Pool2d只用来做下采样,没…

在windows下进行maven安装配置

下载 https://maven.apache.org/download.cgi 安装配置 配置settings.xml文件 如果需要修改仓库的地址&#xff0c;可新增一条localRepository的记录&#xff0c;加上存放下载jar包的地址。 设置Maven镜像下载地址 配置完成&#xff0c;在命令行输入mvn help:system测试&#…

科创板50ETF期权交易:详细规则、费用、保证金和开户攻略

科创板50ETF期权是指以科创板50ETF为标的资产的期权合约。科创板50ETF是由交易所推出的一种交易型开放式指数基金&#xff08;ETF&#xff09;&#xff0c;旨在跟踪科创板50指数的表现&#xff0c;下文介绍科创板50ETF期权交易&#xff1a;详细规则、费用、保证金和开户攻略&am…

uni-app中使用iconfont彩色图标

uni-app中使用iconfont彩色图标 大家好&#xff0c;今天我们来学习一下uni-app中使用iconfont彩色图标&#xff0c;好好看&#xff0c;好好学&#xff0c;超详细的 第一步 首先&#xff0c;从iconfont官网&#xff08;iconfont-阿里巴巴矢量图标库&#xff09;选择自己需要的图…

QT6为工程添加资源文件,并在ui界面引用

以添加图片资源为例 右键工程名字&#xff08;不是最上面的名字&#xff09;&#xff0c;点击添加现有文件 这种方式虽然添加到了工程中&#xff0c;但不能在UI设计界面完成引用。主要原因可能是未把文件放入到项目资源文件中&#xff0c;以下面一种方式可以看出区别。 点击添…

FFmpeg报错:Connection to tcp://XXX?timeout=XXX failed: Connection timed out

一、现象 通过FFmpeg&#xff08;FFmpeg的版本是5.0.3&#xff09;拉摄像机的rtsp流获取音视频数据&#xff0c;执行命令&#xff1a; ./ffmpeg -timeout 3000000 -i "rtsp://172.16.17.156/stream/video5" 报错&#xff1a;Connection to tcp://XXX?timeoutXXX …

生态项目|Typus如何用Sui特性制作动态NFT为DeFi赋能

对于许多人来说&#xff0c;可能因其涉及的期权、认购和价差在内的DeFi而显得晦涩难懂&#xff0c;但Typus Finance找到了一种通过动态NFT使体验更加丰富的方式。Typus NFT系列的Tails为用户带来一个外观逐渐演变并在平台上提升活动水平时获得新特权的角色。 Typus表示&#x…

解决npm install报错: No module named gyp

今天运行一个以前vue项目&#xff0c;启动时报错如下&#xff1a; ERROR Failed to compile with 1 error上午10:19:33 error in ./src/App.vue?vue&typestyle&index0&langscss& Syntax Error: Error: Missing binding D:\javacode\Springboot-MiMall-RSA\V…

【数据结构】2015统考真题 6

题目描述 【2015统考真题】求下面的带权图的最小&#xff08;代价&#xff09;生成树时&#xff0c;可能是Kruskal算法第2次选中但不是Prim算法&#xff08;从v4开始&#xff09;第2次选中的边是&#xff08;C&#xff09; A. (V1, V3) B. (V1, V4) C. (V2, V3) D. (V3, V4) …

maven本地安装jar包install-file,解决没有pom的问题

背景&#xff1a; 公司因为权限问题&#xff0c;没有所有的代码&#xff0c;内部maven还在搭建&#xff0c;所以需要拿到同事的jar包&#xff0c;本地install&#xff1a; mvn install:install-file -DgroupIdcom..framework -DartifactIdcloud-api -Dversion1.0.0-SNAPSHOT …

【C语言】字符函数,字符串函数,内存函数

大家好&#xff01;今天我们来学习C语言中的字符函数&#xff0c;字符串函数和内存函数。 目录 1. 字符函数 1.1 字符分类函数 1.2 字符转换函数 1.2.1 tolower&#xff08;将大写字母转化为小写字母&#xff09; 1.2.2 toupper&#xff08;将小写字母转化为大写字母&…

常用框架分析(7)-Flutter

框架分析&#xff08;7&#xff09;-Flutter 专栏介绍Flutter核心思想Flutter的特点快速开发跨平台高性能美观的用户界面 Flutter的架构框架层引擎层平台层 开发过程使用Dart语言编写代码编译成原生代码热重载工具和插件 优缺点优点跨平台开发高性能美观的用户界面热重载强大的…

服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写的参考笔记

2023/8/29 19:21:11 服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写 2023/8/29 19:22:25 在服务器端使用Django WebSocket和客户端使用Uniapp的情况下&#xff0c;以下是代码示例来实现服务器端和客户端之间的群组互发消息。 …

RTPEngine 通过 HTTP 获取指标的方式

文章目录 1.背景介绍2.RTPEngine 支持的 HTTP 请求3.通过 HTTP 请求获取指标的方法3.1 脚本配置3.2 请求方式 1.背景介绍 RTPEngine 是常用的媒体代理服务器&#xff0c;通常被集成到 SIP 代理服务器中以减小代理服务器媒体传输的压力&#xff0c;其架构如下图所示。这种使用方…

【数据结构】十字链表的画法

十字链表的基本概念 有向边又称为弧 假设顶点 v 指向 w&#xff0c;那么 w 称为弧头&#xff0c;v 称为弧尾 顶点节点采用顺序存储 顶点节点 data&#xff1a;存放顶点的信息firstin&#xff1a;指向以该节点为终点&#xff08;弧头&#xff09;的弧节点firstout&#xff1…

Rabbitmq安装

1、安装说明 安装RabbitMq时需注意&#xff0c;需要先安装Erlang。因为RabbitMq依赖于Erlang&#xff0c;且两者之间的版本是有对应关系的&#xff0c;详细可查看&#xff1a;版本对照表 此外&#xff0c;需要注意的是本教程中采用的安装方式是使用源码安装。非rpm或一键安装方…