对于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 sed命令
- linux sed命令 – 在csv行的每一端添加string
- Linux sed命令 以行为单位编辑文本,或替换文本中的文字
- linux sed命令 删除指定行
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命令
sed命令 linux sed命令详解
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命令 以行为单位编辑文本,或替换文本中的文字
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命令 删除指定行
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命令 删除指定行的相关信息,可以在本站进行搜索。
本文标签: