- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 4 列的 CSV 文件,例如:
0001 @ fish @ animal @ eats worms
我使用 sed
对文件进行查找和替换,但我需要将此查找和替换限制为仅在第 3 列中找到的文本。
我怎样才能让查找和替换只发生在这一列上?
最佳答案
您确定要使用 sed
吗?怎么样csvfix
?您的 CSV 是否漂亮且简单,没有引号或嵌入逗号或其他使正则表达式变得令人讨厌的东西……处理一般 CSV 文件的方式不太令人满意?我假设 @
是您格式中的“逗号”。
考虑使用 awk
而不是 sed
:
awk -F@ '$3 ~ /pattern/ { OFS= "@"; $3 = "replace"; }'
可以说,您应该有一个设置 OFS 一次的 BEGIN block 。对于一行输入,它没有任何胜算(而且您可能也很难衡量一百万行输入的差异):
$ echo "pattern @ pattern @ pattern @ pattern" |
> awk -F@ '$3 ~ /pattern/ { OFS= "@"; $3 = "replace"; }'
pattern @ pattern @replace@ pattern
$
如果 sed
看起来仍然很有吸引力,那么:
sed '/^\([^@]*@[^@]*\)@pattern@\(.*\)/ s//\1@replace@\2/'
例如(请注意输入和输出略有不同 - 如果需要,您可以修复它以处理与 awk
相当相同的操作):
$ echo "pattern@pattern@pattern@pattern" |
> sed '/^\([^@]*@[^@]*\)@pattern@\(.*\)/ s//\1@replace@\2/'
pattern@pattern@replace@pattern
$
第一个正则表达式查找一行的开头、一个非 at 符号字段、一个 at 符号、另一个非 at 符号字段并记住批处理;它寻找一个 at 符号、模式(它必须在第三个字段中,因为前两个字段已经匹配)、另一个 at 符号,然后是该行的剩余部分。当该行匹配时,它用前两个字段替换该行(根据需要未更改),然后添加替换的第三个字段,以及该行的剩余部分(未更改,根据需要)。
如果您需要编辑而不是简单地替换第三个字段,那么您可以考虑使用 awk
或 Perl 或 Python。如果您仍然受限于 sed
,那么您可以探索使用保持空间来保持行的一部分,同时在模式空间中操作其他部分,并最终重新整合您想要的输出行打印行之前的保持空间和模式空间。这几乎和听起来一样困惑;实际上,可能比听起来更困惑。我会选择 Perl(因为我很久以前就学过它,它很容易做这类事情),但您可以使用任何您喜欢的非 sed
工具。
Perl 编辑第三个字段。请注意,默认输出是 $_
,它必须从数组 @F
中的自动拆分字段重新组合。
$ echo "pattern@pattern@pattern@pattern" | sh -x xxx.pl
> perl -pa -F@ -e '$F[2] =~ s/\s*pat(\w\w)rn\s*/ prefix-$1-suffix /; $_ = join "@", @F; ' "$@"
pattern@pattern@ prefix-te-suffix @pattern
$
解释。 -p
表示“循环,将行读入 $_
并打印 $_
在每次迭代结束时'。 -a
表示“自动将 $_
拆分为数组 @F
”。 -F@
表示字段分隔符是@
。 -e
后面是 Perl 程序。在 Perl 中,数组从 0 开始索引,因此第三个字段被拆分为 $F[2]
(符号 — @
或 $
—根据您使用的是数组中的值还是整个数组的值而变化。=~
是匹配运算符;它将 RHS 上的正则表达式应用于 LHS 上的值。替换模式识别零个或多个空格 \s*
后跟 pat
然后是两个“单词”字符,它们被记住到 $1
中,然后是 rn
和零个或多个空格;也许那里应该有一个 ^
和 $
来绑定(bind)到字段的开始和结束。替换是一个空格,'prefix-',记住的字母对,'-suffix'和一个空格。 $_ = join "@", @F;
重新组合输入行 $_
来自可能修改的单独字段,然后 -p
打印出来。不像我想要的那么整洁(所以可能有更好的 wa y 去做),但它有效。并且您可以在 Perl 中对任意字段进行任意转换而不会有太大困难。 Perl 还有一个模块 Text::CSV
(和一个高速 C 版本,Text::CSV_XS
)可以处理非常复杂的 CSV 文件。
关于sed - 如何将查找和替换限制为 CSV 中的一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10050753/
我需要一些有关 Sed 的帮助。我在 Windows 和 Mac OSX 上使用它。我需要 Sed 添加一个 每 4 行,在第一个 之后找到,并在 上停止这样做 我就是找不到办法做到这一点。每
我是一个管理很多网站的轮换团队的一员,我们继承了一个网站的一些特别糟糕的代码,我们正在彻底重新设计该网站。非常可怕的是,开发服务器上有一些链接将您带到实时服务器和旧域以及许多其他可怕的事情。 我一直在
我正在尝试在脚本中运行以下表达式以查找设备并在html文件中更改与该设备关联的字段之一。 sed -e "s/$OLDTEST/$TESTING/" -e "s/$CURRENTVALU/$NEWST
我正在尝试使用 sed 删除所有出现的 #ifdef _WIN32 #endif #ifdef 和 #endif 之间存在的所有内容都是空行。我使用 sed 的经验有限,我已经阅读了一些关于多行功能的
以下命令是什么意思: sed -e '/SUBCKT\ REDBK128S4_LC/,/ENDS/ d' $1 什么,代表? 最佳答案 如果指定两个地址,则指定执行命令的行范围。在您的 sed表达
我需要使用sed注释匹配行和其后的4行的帮助。 在文本文件中。 我的文本文件是这样的: [myprocess-a] property1=1 property2=2 property3=3 proper
我想要一个sed命令来完成以下任务: $ sed s'/:/ /g' sed s'/=/ /g' 也就是说,我想写 sed s'// /g' 并用空格替换=和:。 最佳答案 sed s'/[:=]/
我想在大文件中每隔30行插入一个字符串。我正在使用mini-sed,它不支持〜(波浪号)范围运算符。我正在寻找仅sed的解决方案。 最佳答案 该线程是如何使事情过于复杂的另一个示例。应该这样做: se
有人可以帮我吗? grep " 287 " file.txt | grep "HI" | sed -i 's/HIS/HID/g' sed: no input files 也尝试过 xargs gre
这个问题已经有答案了: How can I replace each newline (\n) with a space using sed? (43 个回答) 已关闭2 年前。 如何使用 sed 命
我们需要屏蔽信用卡号。屏蔽除最后 4 位数字以外的所有数字。我正在尝试使用 SED。由于信用卡号长度从 12 位到 19 位不等,我正在尝试编写正则表达式。以下代码将收到字符串。如果它包含形式为“CA
例如: sed 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' abc.txt 's@' 、 '(' 、 '\?' 、'&' 和 '@' 等含义是什么? 如何找到最合适
我们有一个进程可以使用包含 sed 的文件更改管道输入的命令。 我需要用变量值替换输入中的占位符,例如在一个 -e我可以运行的命令类型; $ echo "Today is XX" | sed -e "
这个问题在这里已经有了答案: Using different delimiters in sed commands and range addresses (3 个答案) 关闭1 年前。 我想问 2
是的,我搜索了该网站,但我认为我没有看到任何东西可以专门解决我无法克服的非常(我想很简单)的问题。 我正在上 Linux 类(class),有人问我这个问题: Use the sed command
我有一个看起来像这样的文件路径列表 abc/def/ghi/jl/r1/r2 abc/def/ghi/jl/r9/r11 abc/nyc/ghi/jl/r3/r4/r5 abc/nyc/ghi/jl/
我在这个文件中有这个文本: test.php $databases = array ( 'default' => array ( 'default' => array (
让我们考虑一个包含以下语句的 SQL 文件作为输入(即 myTable.sql): EXECUTE IMMEDIATE 'CREATE OR REPLACE PUBLIC SYNONYM ' || m
好的,谷歌搜索几分钟后,这似乎是在每行输出前加上 sed 前缀的常规方法 但是我得到一个我不明白的错误。 这是什么意思,我该如何解决? $ sed 's/^/#/' test.txt sed: -e
我有以下文件列表: r1 r2 10 r11 r99 我正在尝试替换 ls 输出中文件名中 r 之后的所有数字 我要找的结果: rA rA rA rA rA 使用下面的 sed 命令我可以匹配
我是一名优秀的程序员,十分优秀!