sed 替换 (替换掉双引号)

Posted

tags:

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

有文本文件 word.txt 格式如下:
INSERT INTO "word" ("Word_ID", "Word_Lib_ID", "Word", "Score", "Created_Time") VALUES (15100,52,'举报',0,'2011-11-25 05:00:27');
INSERT INTO "word" ("Word_ID", "Word_Lib_ID", "Word", "Score", "Created_Time") VALUES (15101,52,'卖国',0,'2011-11-25 05:00:27');
INSERT INTO "word" ("Word_ID", "Word_Lib_ID", "Word", "Score", "Created_Time") VALUES (15102,52,'官僚',0,'2011-11-25 05:00:27');

怎么用 sed 命令 替换上文中的 “ (双引号) 为空 ,并保存为新文件 word_to_mssql.txt
替换的结果为:
INSERT INTO word (Word_ID, Word_Lib_ID, Word, Score, Created_Time) VALUES (15100,52,'举报',0,'2011-11-25 05:00:27');
INSERT INTO word (Word_ID, Word_Lib_ID, Word, Score, Created_Time) VALUES (15101,52,'卖国',0,'2011-11-25 05:00:27');
INSERT INTO word (Word_ID, Word_Lib_ID, Word, Score, Created_Time) VALUES (15102,52,'官僚',0,'2011-11-25 05:00:27');

只定义修改范围为每行的 VALUES 之前 “ (双引号)

cat word.sed
h

s/"//g
s/\(.*\)VALUES.*/\1/
G
s/\(.*\)\n\IN.*\(VALUES.*\)/\1\2/


sed -f word.sed word.txt > word_to_mssql.txt

不好意思,刚才没仔细看,这一次应该不会错了,我自己试了一下
This is "a" and "a" is 1使用后变为This is a and "a" is 1

不过,word.txt的格式必须一直是上面的那种。。。
语句意思,我写在了评论里
诚恳回答,敬请选择追问

非常感谢你的回答。谢谢!
不过我的执行不成功,提示 不是内部或外部命令,也不是可运行的程序或批处理文件;同时,我用了你写的第一次的方法,只能替换第一个和最后一个 " (双引号),中间的双引号无法替换掉。
我想加您为好友,但是百度改版了,不知道怎么加了,我的Q 260871542

恳请您帮帮我,我对这个是一点都不熟悉。

追答

cat word.sed的意思是显示word.sed的内容
你先创建一个文件叫做word.sed
然后将
h

s/"//g
s/\(.*\)VALUES.*/\1/
G
s/\(.*\)\n\IN.*\(VALUES.*\)/\1\2/

复制到word.sed
然后在命令行中写
sed -f word.sed word.txt > word_to_mssql.txt

对了,你也可以用\n来分离语句,然后用s修改前半句,之后用N追加后半句

sed 's/VALUES/VALUES\n/' word.txt |sed '/VALUES/s/"//g' | sed '$!N;s/VALUES\n/VALUES/' > word_to_mssql.txt

参考技术A djy@game-rd10:~> echo '("Word_ID","Word_Lib_ID")'|sed -r 's/\("([A-Z_a-z]+)","([A-Z_a-z]+)"\)/\1",\2"/'
Word_ID",Word_Lib_ID"
追问的问题是这个意思吗?
参考技术B sed 's/\"//g' word.txt > word_to_messql.txt

是这个意思吗?追问

额,替换成功,但是生成新文件时报错,无法找到文件,我试着手动添加新的文件,还是不行。不过后来我直接换成 sed -i 's/\"//g' word.txt ,直接修改原文件了。

另外:
如果只定义修改范围为每行的 VALUES 之前 “ (双引号) ,又该怎么写?

如何使用`sed`替换用双引号括住目录的单引号

【中文标题】如何使用`sed`替换用双引号括住目录的单引号【英文标题】:How can I use `sed` to replace the single quotes enclosing a directory with double quotes 【发布时间】:2014-08-07 20:20:56 【问题描述】:

我想要达到的目标:

假设我有一个文件file,内容如下:

ENV_VAR='/foo/`whoami`/bar/'
sh my_script.sh 'LOL'

我想替换 - 使用 sed - 单引号 包围目录名称,而不是那些包围看起来不像目录的东西,例如,参数一个脚本。

也就是说,在运行sed 命令后,我希望得到以下输出:

ENV_VAR="/foo/`whoami`/bar/"
sh my_script.sh 'LOL'

我们的想法是在不使用tr' 替换为"seds/'/"/g 的情况下实现这一点,因为我不想替换似乎不是的行目录。

请注意sedAIX 上运行,因此没有GNU sed 可用。

我尝试过的:

如果我像这样使用sed

sed "s;'=.*/.*';&;g" file

...& 变量保存了之前匹配的正则表达式,即:='/foo/`whoami`/bar/'。但是,我不知道如何进行替换,以便将 单引号 转换为 双引号

我想知道是否有办法通过单线仅使用sed 来完成这项工作。

【问题讨论】:

【参考方案1】:

这样就可以了:

/usr/bin/sed -e "/='.*\/.*'/ s/'/\"/g" file

基本上,您只需要简单的 ' => " 替换,但不是针对所有行,仅针对与模式 ='.*\/.*'/ 匹配的行。并且,在 s 命令中,您只需要转义 "。

【讨论】:

那么,您可以使用s/x/y/g 作为 "outer" sed 中的替换部分吗?这对我来说是新的!谢谢!【参考方案2】:

这应该可行:

sed "s/'\(.*\/.*\)'/\"\1\"/g"

捕获' 之间的部分并使用反向引用。

【讨论】:

以上是关于sed 替换 (替换掉双引号)的主要内容,如果未能解决你的问题,请参考以下文章

shell中,如何替换双引号中内容为某个变量?

Shell sed 如何替换单引号,回车符,以及分号

sed字符串替换

sed字符串替换

shell中的   中文和英文   双引号

使用 Sed Mac 终端查找和替换空格