linux centos7 bash中字符串反向输出

news2024/11/26 8:28:13

给定一个字符串,如何反向(倒序)输出?

字符串反转的方法: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和变量的深入理解与灵活应用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第四阶段】kotlin语言的list遍历

package Stage4fun main() {val list listOf(1,2,3,4,5,6,7,8,9)//第一种方式 for()println("第一种方式遍历元素&#xff1a;")for (i in list){print("元素&#xff1a;$i")}println()//第二种方式forEachprintln("第二种方式遍历元素&#xff1a;…

微信短链跳转到小程序指定页面调试

首先说下背景&#xff1a;后端给了短链地址&#xff0c;但是无法跳转到指定页面。总是在小程序首页。指定的页面我们是h5页面。排查步骤如下&#xff1a; 1、通过快速URL Scheme 编译。上部普通编译 下拉找到此选项。 、 2、按照小程序的要求的URL Scheme输入。另外后端给的…

满足每个用户的分析需求,奥威BI数据可视化工具真没吹牛

我们都知道&#xff0c;随着BI商业智能技术的发展&#xff0c;现在做数据可视化分析的效率越来越高&#xff0c;操作难度也越来越低&#xff0c;但真能随时满足每个用户的分析需求&#xff1f;奥威BI数据可视化工具真没吹牛。 在奥威BI数据可视化工具上还真有一种功能可及时且…

20个值得收藏的WebGL性能优化技巧

WebGL 是一项功能强大的技术&#xff0c;允许开发人员使用基于 OpenGL ES 图形标准的 WebGL API 在 Web 浏览器中创建 3D 图形。 然而&#xff0c;由于在 Web 环境的限制下实时渲染 3D 图形的复杂性&#xff0c;优化 WebGL 性能可能具有挑战性。 推荐&#xff1a;用 NSDT编辑器…

微信小程序修改数据,input不能实时回显

场景&#xff1a; 填写发票抬头&#xff0c;填写抬头公司时候&#xff0c;会根据用户输入的内容实时获取相关的公司信息&#xff0c;用户选择搜索出来的公司&#xff0c;这时候 setData,但是数据并没有回显&#xff0c;而是需要再需要点一下屏幕。 解决方案&#xff1a; 原来…

8月24-25日上课内容 第三章 MySQL索引、事务与存储引擎

本章结构 索引介绍 1、索引的概念 索引就是一种帮助系统能够快速查询信息的结构 2、索引的作用 设置索引之后查询速度变快&#xff0c;当表很大或查询涉及到多个表时&#xff0c;可以成千上万倍地提高查询速度 加快表与表之间连接 降低数据库的IO成本 创建唯一索引来保证…

【dart】dart基础学习使用(一):变量、操作符、注释和库操作

前言 学习dart语言。 注释 Dart 支持单行注释、多行注释和文档注释。 单行注释 单行注释以 // 开头。Dart 编译器将忽略从 // 到行尾之间的所有内容。 void main() {// 这是单行注释print(Welcome to my Llama farm!); }多行注释 多行注释以 /* 开始&#xff0c;以 / 结…

KubeFlow组件介绍

kubeflow是一个胶水项目&#xff0c;它把诸多对机器学习的支持&#xff0c;比如模型训练&#xff0c;超参数训练&#xff0c;模型部署等进行组合并已容器化的方式进行部署&#xff0c;提供整个流程各个系统的高可用及方便的进行扩展部署了 kubeflow的用户就可以利用它进行不同的…

合并两个有序的单链表,合并之后的链表依然有序

定义节点 class ListNode {var next: ListNode _var x: Int _def this(x: Int) {thisthis.x x}override def toString: String s"x>$x" } 定义方法 class LinkedList {var head new ListNode(0)def getHead(): ListNode this.headdef add(listNode: Li…

省级专精特新!祝贺旭帆科技荣获安徽省“专精特新”中小企业!

2023年8月&#xff0c;安徽旭帆信息科技有限公司&#xff08;以下简称“旭帆科技”&#xff09;成功荣获2023年度“安徽省专精特新中小企业”荣誉称号&#xff0c;成为具备专业化、精细化、特色化、新颖化的“专精特新”企业。 随着《“十四五”促进中小企业发展规划》的深入实…

mysql 查看 、设置缓冲池 buffer_pool

Mysql 存储引擎 MyIsam 和 Innodb 引擎 myIsam 存储引擎&#xff1a; 只缓存索引&#xff0c;不缓存数据&#xff0c;对应的键缓存参数为 key_buffer_size show variables like ‘key_buffer_size’; set global key_buffer_sizexxxx; 或者 my.ini my.cnf [server] key_buffer…

二三维电子沙盘数字沙盘虚拟现实开发教程第14课

二三维电子沙盘数字沙盘开发教程第14课 很久没有写了&#xff0c;主要前段时间在针对怎么显示高精度的 倾斜数据而努力&#xff0c;现在终于实现了效果不错。以前的版本显示倾斜数据控制不太好。 对了。目前系统暂只支持smart3d生成的kml格式的数据&#xff0c;由专有的录入程…

教你如何做正交表

正交表是一种用于多因素实验设计的表格。它可以帮助我们在尽可能少的试验次数下确定各个因素对结果的影响&#xff0c;从而提高实验效率。接下来将从以下几个方面介绍正交表的相关内容。 一、正交表基本概念 正交表是一种特制的表格&#xff0c;用于多因素实验设计研究。根据正…

马蹄集oj赛(第十次)

目录 2的N次幂 升级版斐波那契数列 个数统计 个数统计2 大斐列 AB problem ​编辑 A-B problem 快速幂 进行一个幂的运算 整数大小比较 2的N次幂 难度&#xff1a;黄金 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;128M 任意给定一个正整数N(N≤100)&#xff0…

Qt6 for Windows 环境搭建(Visual Studio)

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 在 Windows 中&#xff0c;如果想要开发 Qt 应用程序&#xff0c;可以选择多种方式&#xff1a; Qt Creator MinGW 编译器Qt Creator MSVC 编译器Visual Studio&#xff0…

线上祭奠软件:虚拟纪念与情感表达的新方式

线上祭奠软件作为一种新兴的技术应用&#xff0c;正在改变传统祭奠方式&#xff0c;为人们提供了跨越时空的虚拟纪念和情感表达方式。本文将深入探讨线上祭奠软件的意义、功能与挑战&#xff0c;并思考其对社会和个人的影响。 一、线上祭奠软件的意义&#xff1a; 1.跨…

MyBatis —— 初窥门径

前言 MyBatis作为一款优秀的持久层框架&#xff0c;在Java后端开发中无疑是比较重要一环&#xff0c;在常见的spring整合的SSM框架以及之后的SpringBoot中都可以看到MyBatis大显神威的模样。在这篇文章中&#xff0c;荔枝将会从Maven开启创建一个MyBatis项目并整理MyBatis相应的…

服务器放在香港好用吗?

​  相较于国内服务器&#xff0c;将网站托管在香港服务器上最直观的好处是备案层面上的。香港服务器上的网站无需备案&#xff0c;因此更无备案时限&#xff0c;购买之后即可使用。 带宽优势 香港服务器的带宽一般分为香港本地带宽和国际带宽、直连中国骨干网 CN2三种。香港…

函数注解学习

def hanshuzhujie(a:str,b: str m)->str:print(hanshuzhujie.__annotations__)return ab hanshuzhujie(qqq)运营结果 E:\Python\Python38\python.exe D:/pythonprojects/python-auto-test/test/hanshuzhujie.py {a: <class str>, b: <class str>, return: <…

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

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