shell脚本实现字符串的动态替换方法

背景

我们有时候需要完成字符串的多组替换,比如需要完成以下替换

  • 将“小草”替换为“真是让人印象深刻”
  • 将“小狗的”替换为“可爱的”
  • 将“你听清楚了吗”替换为“我说明白了吗”
  • 将“我不会”替换为“我可以学”
  • 将“打麻将”替换为“修长城”
  • 将“打游戏”替换为“计算机实践练习”

在shell脚本中全部替换的方式为${var//old/new}。我们可以通过如下命令替换:

1

2

3

4

5

6

var=${var//小草/真是让人印象深刻}

var=${var//小狗/可爱的}

var=${var//你听清楚了吗/我说明白了吗}

var=${var//我不会/我可以学}

var=${var//打麻将/修长城}

var=${var//打游戏/计算机实践练习}

但是如果替换规则有变化,比如新增一条替换规则:将“单身狗”替换为“萌新”,那就要手动修改代码。如果只是一两个脚本还好,但是如果脚本较多,还是不好维护。

此时,就需要专门写一个工具实现这种文本替换,而且最好是将替换规则和代码分离,可以让非编程人员来维护替换规则。

下文是我的实现。

代码

shell脚本:ReplaceStr.sh:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

#!/bin/bash

# ------------------------------------------

# Filename    : ReplaceStr.sh

# Version     : 1.1

# Date        : 2022-10-23 16:04:25

# Author      : 农民工老王@CSDN

# Email       : scwja@qq.com

# Website     : https://blog.csdn.net/monarch91

# Description : 用于追踪文件变化的脚本

# ------------------------------------------

needReplaceStr="$1"

listPath="$2"

if [ ! -f "${listPath}" ]; then

  echo "错误:脚本文件缺失!"

else

  IfsTemp=$IFS

  IFS=$';'

  fileList=$(cat "${listPath}"|xargs)

  fileArray=(${fileList})

  for item in "${fileArray[@]}"

  do

    itemLengthStr=$(echo ${item}|wc -L)

    itemLength=$((${itemLengthStr}))

    if [ ${itemLength} -gt 3  ] && [ "${item:0:1}" != "#" ]; then

      v=(${item//:/;})

      srcStr="${v[0]:1}"

      tarStr="${v[1]}"

      needReplaceStr=${needReplaceStr//${srcStr}/${tarStr}}

      needReplaceStr=${needReplaceStr//${srcStr^^}/${tarStr^^}}

      needReplaceStr=${needReplaceStr//${srcStr,,}/${tarStr,,}}

    fi

  done

  IFS=$IfsTemp

fi

echo "$needReplaceStr"

替换规则 map.txt:
第一行为标题不可删,从第二行开始为替换规则,每条规则,以英文冒号连接新旧字符串,以英文分号结尾。

#替换规则;
小草:真是让人印象深刻;
小狗的:可爱的;
你听清楚了吗:我说明白了吗;
我不会:我可以学;
打麻将:修长城;
打游戏:计算机实践练习;
单身狗:萌新

使用示例

使用方法为:./ReplaceStr.sh ${带操作字符串} ${替换规则},例如:

用shell实现某行字符串的替换

1.示例:

将/SE/test.conf文件中含有#__TEST__的行替换为http://127.0.0.1:1111;#__TEST__

2.实现:test_conf_contrl.sh

1

2

3

4

5

6

#/bin/sh

http=$1

test_conf=/SE/test.conf

Line=`cat test_conf | grep -wn "#__TEST__" | awk -F: '{print $1}'`

sed -i ''$Line'd' $test_conf

sed -i ''$Line'i '$1';#__TEST__' $test_conf

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sinat_40572875

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值