GVKun编程网logo

Linux Shell编程 sed命令(linux中shell编程详解)

3

对于LinuxShell编程sed命令感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍linux中shell编程详解,并为您提供关于Linuxsed命令、linuxsed命令–在csv行的每一端

对于Linux Shell编程 sed命令感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍linux中shell编程详解,并为您提供关于Linux sed命令、linux sed命令 – 在csv行的每一端添加string、Linux sed命令 以行为单位编辑文本,或替换文本中的文字、linux sed命令 删除指定行的有用信息。

本文目录一览:

Linux Shell编程 sed命令(linux中shell编程详解)

Linux Shell编程 sed命令(linux中shell编程详解)

概述

sed 是一种几乎可以应用在所有 UNIX 平台(包括 Linux)上的轻量级流编辑器,体积小。所以,它可以对从如管道这样的标准输入中接收的数据进行编辑。 

sed 主要是用来将数据进行选取、替换、删除、新増的命令。我们看看命令的语法:

[root@localhost ~] # sed [选项] ''[动作]'' 文件名

选项:

  • -n:一般 sed 命令会把所有数据都输出到屏幕上。如果加入此选项,则只会把经过 sed 命令处理的行输出到屏幕上;
  • -e: 允许对输入数据应用多条 sed 命令编辑;
  • -f 脚本文件名:从 sed 脚本中读入 sed 操作。和 awk 命令的 -f 选项非常类似;
  • -r:在 sed 中支持扩展正则表达式;
  • -i:用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出动作;
  • a \:追加,在当前行后添加一行或多行。当添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结;
  • c \:行替换,用c后面的字符串替换原数据行。当替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结;
  • i \:插入,在当前行前插入一行或多行。当插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结;
  • d:删除,删除指定的行;
  • p:打印,输出指定的行;
  • s:字符串替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字串/新字串/g”(和Vim中的替换格式类似);

sed 所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,则连文件都没有),而是把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。

sed命令示例

sed行数据操作示例

利用"p"动作查看student.txt 文件的第二行 。

[root@localhost ~]# sed ''2p'' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66

"p"动作输出了第二行数据,但是 sed 命令还会把所有数据都输出一次。如果只想输出指定某行数据,则需要添加"-n"选项。

[root@localhost ~]# sed -n ''2p'' student.txt
1 Liming 82 95 86 87.66

删除从第二行到第四行的数据,文件本身并没有被修改

[root@localhost ~]#sed ''2,4d'' student.txt
 ID Name PHP Linux MySQL Average
[root@localhost ~]# cat student.txt
 ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66

sed命令中所有的动作必须使用"单引号"包含;在动作中可以使用数字代表行号,逗号代表连续的行范围。使用"$"代表最后一行,如果动作是"2,$d",则代表从第二行删除到最后一行。

在第二行后加入hello

[root@localhost ~]# sed ''2a hello'' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
hello
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66

"a"动作会在指定行后追加数据。如果想要在指定行前插入数据,则需要使用"i"动作。

在第二行前插入两行数据

[root@localhost ~]# sed ''2i hello > world'' student.txt
ID Name PHP Linux MySQL Average
hello
world
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66

如果想追加或插入多行数据,则除最后一行外,每行的末尾都要加入"\"代表数据未完结。

使用"-n"选项只查看sed命令操作的数据

[root@localhost ~]# sed -n''2i hello \
world'' student.txt
hello
world

实现行数据替换 

[root@localhost ~]# cat student.txt | sed ''2c No such person''
ID Name PHP Linux MySQL Average
No such person
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66

sed 命令在默认情况是不会修改文件内容的。如果我确定需要让 sed 命令直接处理文件的内容,则可以使用"-i"选项。可以使用这样的命令:

[root@localhost ~]# sed -i''2c No such person'' student.txt

sed命令的字符串替换示例

"c"动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用"s"动作了。"s"动作的格式如下:

[root@localhost ~]# sed''s/旧字符串/新字符串/g'' 文件名

在第三行中,把74换成99

[root@localhost ~]# sed ''3s/74/99/g'' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 99 96 87 85.66
3 Gao 99 83 93 91.66

如果想把某行的成绩注释掉,让它不再生效,则可以这样做:

[root@localhost ~]#sed ''4s/^/#/g'' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
#3 Gao 99 83 93 91.66

在这里使用正则表达式,"^"代表行首
不仅如此,我们还可以同时把"Liming"和"Gao"替换为空 

[root@localhost ~]# sed -e ''s/Liming//g; s/Gao//g'' student.txt
ID Name PHP Linux MySQL Average
1 82 95 86 87.66
2 Sc 74 96 87 85.66
3 99 83 93 91.66

"-e"选项可以同时执行多个 sed 动作,多个动作之间要用";"或回车分隔,例如,上一条命令也可以这样写:

[root@localhost ~]# sed -e ''s/Liming//g
> s/Gao//g'' student.txt
ID Name PHP Linux MySQL Average
1 82 95 86 87.66
2 Sc 74 96 87 85.66
3 99 83 93 91.66

 

Linux sed命令

Linux sed命令

sed命令 linux sed命令详解

linux sed命令 – 在csv行的每一端添加string

linux sed命令 – 在csv行的每一端添加string

目前,我对ff CSV数据有问题。

COLUMN1,COLUMN2,COLUMN3,COLUMN4 apple1,apple2,apple3,apple4 banana1,banana2,banana3,caimito1,"caimito21 caimito22","caimito31 caimito32",caimito4

这看起来像这样:

╔══════════╦═══════════╦═══════════╦══════════╗ ║ COLUMN1 ║ COLUMN2 ║ COLUMN3 ║ COLUMN4 ║ ╠══════════╬═══════════╬═══════════╬══════════╬ ║ apple1 ║ apple2 ║ apple3 ║ apple4 ║ ║ banana1 ║ banana2 ║ banana3 ║ ║ ║ caimito1 ║ caimito21 ║ caimito31 ║ caimito4 ║ ║ ║ caimito22 ║ caimito32 ║ ║ ╚══════════╩═══════════╩═══════════╩══════════╝

所以我的计划是添加COLUMN5,它的每一行都会有一个值“FRUIT”。

使用的命令:

将CSV值导入Bash

在bash(Linux)中查找另一个csv的值(如vlookup)

Powershell将variables传递给作业

使用脚本将.csv文件加载到MysqL数据库中

使用自定义文件名path复制csv

sed "1 s/$/,COLUMN5/g" FILE.csv | sed "2,$ s/$/,FRUIT/g" > OUTPUT.csv

输出:

╔══════════╦════════════════╦════════════════╦══════════╦═════════╗ ║ COLUMN1 ║ COLUMN2 ║ COLUMN3 ║ COLUMN4 ║ COLUMN5 ║ ╠══════════╬════════════════╬════════════════╬══════════╬═════════╣ ║ apple1 ║ apple2 ║ apple3 ║ apple4 ║ FRUIT ║ ║ banana1 ║ banana2 ║ banana3 ║ ║ FRUIT ║ ║ caimito1 ║ caimito21FRUIT ║ caimito31FRUIT ║ caimito4 ║ FRUIT ║ ║ ║ caimito22 ║ caimito32 ║ ║ ║ ╚══════════╩════════════════╩════════════════╩══════════╩═════════╝

有什么办法可以在不影响“caimito”行的情况下添加“FRUIT”?

我也试过ff。 指挥,但没有成功。 在“$”之前添加“,”。

sed "1 s/$/,$ s/,$/,FRUIT/g" > OUTPUT.csv

在batch file中用批处理脚本与vbscript命令问题

odo在csv和MysqL之间转换数据

如何使用awk或sed调整bash中的列字段的长度?

MysqL导出后找不到文件

从长行删除一个字段的位置

Sed可能不是处理csv文件的正确工具,因为规则比看上去更复杂(这可能是可能的,但是这样的脚本通常比较容易出错等)。 但是,您可以使用csvtools来处理这个问题:

file="FILE.csv" nr=$(csvtool height $file) ot=$(perl -e "print "COLUMN5\n";for$i(2..$nr){print "FRUIT\n";}") echo "$ot" | csvtool paste "$file" -

脚本工作如下:

首先我们计算csvtool height的行数,

接下来我们通过打印COLUMN5然后n-1次FRUIT产生附加列。

最后,我们将该内容粘贴到文件的右侧。

编辑:我只看到csvtool解决方案; 这当然是更实际的。 我离开这个解决方案主要是因为隐藏它和它的lovecraftian美是可惜的。

那么,这里呢。 这是一个在sed中完成的方法:

sed ':a $!{ N; ba }; s/"[^"]*"/{&}/g; :bs/({"[^"]*)n([^"]*"})/1~"~2/g; tb; s/n|$/,FRUIT&/g; s/,FRUIT(n|$)/,COLUMN51/; :cs/({"[^"])*~"~/1n/g; tc; s/{"|"}/"/g' filename

这将是一个有点蹊跷。 它的工作原理如下:

:a $!{ N; ba } # assemble the whole file in the # hold buffer s/"[^"]*"/{&}/g # encase all "-enclosed fields in # {"..."} to make matching the beginning # and end separately possible. :b # jump mark for looping s/({"[^"]*)n([^"]*"})/1~"~2/g # replace the first newline in all # {"..."} fields with ~"~ tb # loop until all were replaced s/n|$/,FRUIT&/g # Put FRUIT at the end of all lines s/,COLUMN51/ # Replace the first,FRUIT with,COLUMN5 # The (n|$) bit is so that this # works with empty files (that only # have a header line) :c # Jump mark for looping s/({"[^"])*~"~/1n/g # replace the first ~"~ in all {"..."} # fields with a newline tc # loop until all were replaced s/{"|"}/"/g # replace all {","} markers with " # again.

sed '1 { s/$/,COLUMN5/ b } :load /^([^"]*"[^"]*")*[^"]*"[^"]*$/ { N b load } s/$/,/;s/^(([^,]*,){4}).*/1FRUIT/' YourFile

第一行添加COLUMN5比循环( b )

如果打开"在当前工作缓冲区中,则加载新行并重试该操作

添加4,默认情况下

先将4个第一组分开,再加上FRUIT

(周期)

POSIX版本so --posix在GNU sed上使用

对于一个“有效的” csv(1行,所有参数分开,),只需删除加载循环部分

Linux sed命令 以行为单位编辑文本,或替换文本中的文字

Linux sed命令 以行为单位编辑文本,或替换文本中的文字

sed -e 4a\newLine testfile 

首先查看testfile中的内容如下:

$ cat testfile #查看testfile 中的内容  
HELLO LINUX! Linux is a free unix-type opterating system. This is a linux testfile! Linux test 

使用sed命令后,输出结果如下:

$ sed -e 4a\newline testfile #使用sed 在第四行后添加新字符串  HELLO LINUX! #testfile文件原有的内容  Linux is a free unix-type opterating system. This is a linux testfile! Linux test newline   

linux sed命令 删除指定行

linux sed命令 删除指定行

sed命令常用到的两个选项:
-i : 直接在文件上编辑 (edit files in place)
-e[默认选项]:只在命令行输出,而文件不改变
(add the script to the commands to be executed)
注:使用sed命令可以使用 -i 或者 -e 选项(以下例子仅以-i举例)

sed命令删除特定行号
删除第N行
sed -i 'Nd' filename

删除第N~M行
sed -i 'N,Md' filename # file的[N,M]行都被删除

删除shell变量表示的行号(配合for等语句使用)
sed -i "${var1},${var2}d" filename # 这里引号必须为双引号

删除最后一行
sed -i '$d' filename


删除包含"xxx"的行
sed -i '/xxx/d' filename

 

我们今天的关于Linux Shell编程 sed命令linux中shell编程详解的分享就到这里,谢谢您的阅读,如果想了解更多关于Linux sed命令、linux sed命令 – 在csv行的每一端添加string、Linux sed命令 以行为单位编辑文本,或替换文本中的文字、linux sed命令 删除指定行的相关信息,可以在本站进行搜索。

本文标签: