shell脚本替换文本内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本替换文本内容相关的知识,希望对你有一定的参考价值。

shell脚本替换文本内容现有文件内容如下:
*******
index="6" *******************
index="2" *******************
index="1" *******************
index="5" *******************
index="3" *******************
index="4" *******************
*******
我想通过shell脚本直接修改文件实现如下效果:
*******
index="1" *******************
index="2" *******************
index="3" *******************
index="4" *******************
index="5" *******************
index="6" *******************
*******
即数字按顺序排列,其他内容不变,请问如何实现呢?

参考技术A 1、按=分割取第二列
cat $file1|grep mqserver|awk -F= 'print $2'`
2、直接替换文件内容
sed -i "s/127.0.0.1/192.168.1.1/" file1
3、实例:
#!/bin/sh
file1=ip1.txt
file2=ip2.txt
IP1=`cat $file1|grep mqserver|awk -F= 'print $2'`
IP2=`cat $file2|grep ip|awk -F= 'print $2'`
echo change $IP1 to $IP2.
sed -i "s/$IP1/$IP2/" $file1
more $file1追问

像你这样直接复制粘贴别人的有意思吗?就为了蹭分?就算粘贴也用心点好吗?

参考技术B

如你文档所述:假定文件名为test.txt

sort  -nk 2 -t '"' test.txt >testnew.txt

追问

你好,刚才试了下sort命令,结果是把所有的行按照数字顺序重新排列了,我现在想要达到的效果是每行的顺序不变,只是index里面的数字从1开始递增,比如利用变量自增,昨天试过用sed命令,但如何用变量自增去替换原来的数字不太清楚,请问有办法吗?

追答

有一个笨办法,你试试

awk -F'"' 'if ($2 ~/[0-9]+/)print $0' test.txt |awk -F'"' 'OFS="\\"" $2 ~/[0-9]+/$2=NR;print $0'  >testnew.txt

awk -F'"' 'if ($2 ~/[0-9]+/)print $0' test.txt |awk -F'"' 'OFS="\\""for(i=1;i<=NR;i++)$2=iprint $0'  >testnew.txt

Shell脚本学习指南 [ 第四章 ] 查找与替换文本处理工具

摘要:第三章讨论的是编写Shell脚本时经常用到的两个基本操作。第四章总共介绍了约30种处理文本文件的好用工具。

第三章 查找与替换

概括:本章讨论的是编写Shell脚本时经常用到的两个基本操作:文本查找、文本替换。

3.1  查找文本

如需从输入的数据文件中取出特定的文本行,主要的工具为grep程序。POSIX采用三种不同grep变体:grep、egrep、fgrep整合为单个版本,通过不同的选项,分别提供这三种行为模式。
who | grep -F root
上面使用-F选项,以查找固定字符串root。事实上,只要匹配的模式里未含有正则表达式的meta字符,则grep默认行为模式就等同于使用了-F。

3.2  正则表达式

POSIX的正则表达式有两种,基本正则表达式(BRE)以及扩展正则表达式(ERE)。
sed是处理简单字符串替换的主要工具。
在某些程序语言里,单个字符串可能包含数行,那种情况下,^与$指的分别是字符串的开头与结尾。
正则表达式匹配范例:
表达式 匹配
tolstoy 位于一行上任何位置的7个字母:tolstoy
^tolstoy 7个字母tolstoy,出现在一行的开头
tolstoy$ 7个字母tolstoy,出现在一行的结尾
^tolstoy$ 正好包括tolstoy这7个字母的一行,没有其他的任何字符
[Tt]olstoy 在一行上的任意位居中,含有Tolstoy或是tolstoy
tol.toy 在一行上的任意位居中,含有tol这3个字母,加上任何一个字符,再接着toy这三个字母
tol.*toy 在一行上的任意位居中,含有tol这3个字母,加上任意的0或多个字符,再继续toy这三个字母

区间表达式匹配规则:
\{n\} 前置正则表达式所得结果重现n次
\{n,\} 前置正则表达式所得结果重现至少n次
\{n,m\} 前置正则表达式所得结果重现n至m次

在s命令里以g结尾表示的是,全局性。如:
$ echo Tolstoy reads well. Tolstoy writes well. >example.txt 输入样本
$ sed ‘s/Tolstoy/Camus/‘ < example.txt 没有设置g
Camus reads well. Tolstoy writes well.
$ sed ‘s/Tolstoy/Camus/g‘< example.txt 设置了‘g‘
Camus reads well. Camus writes well.
$sed ‘s/Tolstoy/Camus/2‘ < example.txt 仅替代第二个匹配者
Tolstoy reads well.Camus writes well.

sed -n ‘10,42p‘ foo.xml 仅打印10-42行

3.3  字段处理

cut命令用以剪下选定的字符范围或字段,join则是用来结合记录中具有共同键值的字段的文件。
awk多半用于简单的“命令行程序”,当想要只显示选定的字段,或是重新安排行内的字段顺序时,就是awk派上用场的时候了。

awk ‘{ print $1}‘ file 打印第一个字段
awk ‘{ print $2,$5}‘ file 打印第2与第5个字段
awk ‘{ print $1,$NF}‘ file 打印第一个与最后一个字段
awk ‘NF>0 {print $0}‘ file 打印非空行
awk ‘NF>0‘ file 同上

第四章 文本处理工具

摘要:本章总共介绍了约30种处理文本文件的好用工具。它们都是功能很强的工具组,可用来编写Shell脚本。

4.1  排序文本

sort -t: -k1,1 file 以冒号隔开的第一个字段进行排序
sort -t: -k2nr,2 file 从字段2起始处开始,以数值类型反向排序并结束于字段3的结尾
sort -t: -k2n -k3n file 先以第二列排序,在以第三列排序
sort -t: -k2n -u file 输出键值字段匹配的唯一记录

4.2  删除重复

sort file |uniq 显示唯一的排序后的记录
sort file |uniq -c 计数唯一的排序后的记录
sort file |uniq -d 仅显示重复的记录
sort file |uniq -u 仅显示未重复的记录

4.3  重新格式化段落

fmt -s -w 10 file               长度大于10的行格式化为短的行

4.4  计算行数、字数以及字符数

echo hello wrold |wc 计算行数、字数、字节数
echo hello world |wc -c 计算字节数
echo hello world |wc -l 计算行数
echo hello world |wc -w 计算字数
wc file1 file2 计算两个文件里的数据

4.5  打印

4.6  提取开头或结尾数行

head -n file 输出文件的前n行
tail -n file 输出文件的后n行

以上是关于shell脚本替换文本内容的主要内容,如果未能解决你的问题,请参考以下文章

(shell脚本)特殊分隔符文本文件导入MongoDB

如何在shell脚本中修改添加替换指定文件中的内容

shell脚本替换A、B两个文件里面的内容

Shell脚本学习指南 [ 第四章 ] 查找与替换文本处理工具

如何在shell脚本中修改添加替换指定文件中的内容

使用 shell 脚本将文本替换为 pwd