因为我是sed的新手,所以我很高兴看到sed不认为\ r \n字符是有效的行分隔符.
有没有人知道如何告诉sed在处理多行文本时,我希望将哪些字符用作行分隔符?
让我们说我们有这个文件:
{
"persons": [
{
"friends": 4,
"phoneNumber": 123456,
"personID": 11111
},
{
"friends": 2057,
"phoneNumber": 432100,
"personID": 22222
},
{
"friends": 50,
"phoneNumber": 147258,
"personID": 55555
}
]
}
Run Code Online (Sandbox Code Playgroud)
我现在想提取的人的电话号码11111
,22222
,33333
,44444
并55555
以分号分隔的字符串:
123456;432100;;;147258
Run Code Online (Sandbox Code Playgroud)
在跑步的时候
cat persons.txt | jq ".persons[] | select(.personID==<ID>) | .phoneNumber"
Run Code Online (Sandbox Code Playgroud)
每次一次<ID>
并将结果与后续工作粘合在一起;
,这非常慢,因为它必须为每个ID(以及我想要提取的其他字段)重新加载文件.
在单个查询中连接它:
cat persons.txt | jq "(.persons[] | select(.personID==11111) | .phoneNumber), (.persons[] | select(.personID==22222) | .phoneNumber), (.persons[] | select(.personID==33333) | .phoneNumber), (.persons[] | select(.personID==44444) …
Run Code Online (Sandbox Code Playgroud) 我试图删除管道中的所有换行符,如下所示:
(echo foo; echo bar) | sed -e :a -e N -e '$!ba' -e 's/\n/ /g' | hexdump -C
Run Code Online (Sandbox Code Playgroud)
导致debian挤压的结果如下:
00000000 66 6f 6f 20 62 61 72 0a |foo bar.|
00000008
Run Code Online (Sandbox Code Playgroud)
不删除尾随换行符.
tr -d '\n'
如在如何从文本文件中删除换行符?工作得很好,但不是sed.
标题已注明:
我想使用一些Linux一线(例如sed)
转变
Anytext
{
Run Code Online (Sandbox Code Playgroud)
进入
Anytext{
Run Code Online (Sandbox Code Playgroud)
可以使用sed来完成此操作,如果不使用sed则可以使用awk一个内衬来完成?
我有一个问题应该让大多数人都去"WTF?",但我仍然拥有它.
我从供应商处获得了大量数据文件.它采用自定义平面文件格式,声称为CSV,但不以逗号分隔,并且不引用值.所以,根本不是真正的CSV.
foo,bar,baz
alice,bob,chris
Run Code Online (Sandbox Code Playgroud)
等等,除了更长,更少有趣.问题是,有些记录嵌入了换行符(!!!):
foo,bar
rab,baz
alice,bob,chris
Run Code Online (Sandbox Code Playgroud)
这应该是每个三个字段的两个记录.通常情况下,我只会说"不,这是愚蠢的.",但我不经意地看得更近了,发现它实际上是一种不同于实际行结束序列的行尾:
foo,bar\n
rab,baz\r\n
alice,bob,chris\r\n
Run Code Online (Sandbox Code Playgroud)
注意第一行上的\n.我已经确定这适用于我发现嵌入式换行的所有情况.所以,我需要基本上做s/\n$//
(我尝试了这个特定的命令,它没有做任何事情).
注意:我实际上并不关心字段的内容,因此无需更换换行符.我只需要文件中的每一行都有相同数量的记录(理想情况下,在同一个地方).
我在处理文件的工具中有一个现有的解决方案:
Guid g = Guid.NewGuid();
string data = File.ReadAllText(file, Encoding.GetEncoding("Latin1"));
data = data.Replace("\r\n", g.ToString()); //just so I have a unique placeholder
data = data.Replace("\n", "");
data = data.Replace(g.ToString(), "\r\n");
Run Code Online (Sandbox Code Playgroud)
但是,对于大于千兆字节左右的文件,这会失败.(另外,我没有对它进行分析,但我怀疑它的狗也很慢).
我可以使用的工具是:
做这个的最好方式是什么?
我仍然是shell脚本的菜鸟,但我正在努力.下面是一个部分工作的shell脚本,它应该通过匹配标记并删除其附带的内容来从*.htm文档中删除所有JS.例如<script src="">
,<script></script>
和<script type="text/javascript">
find $1 -name "*.htm" > ./patterns
for p in $(cat ./patterns)
do
sed -e "s/<script.*[.>]//g" $p #> tmp.htm ; mv tmp.htm $p
done
Run Code Online (Sandbox Code Playgroud)
这个问题是脚本是因为sed逐行读取文本输入,这个脚本将无法按预期使用换行.运行:
<script>
//Foo
</script>
Run Code Online (Sandbox Code Playgroud)
将删除第一个脚本标记,但将省略我不想要的"foo"和结束标记.
有没有办法匹配我的正则表达式中的换行符?或者如果sed
不合适,还有什么我可以使用的吗?
我有一个csv文件,其中一些单元格内部有换行符.例如:
id,name
01,"this is
with newline"
02,no newline
Run Code Online (Sandbox Code Playgroud)
我想删除单元格内的所有换行符.
如何使用正则表达式或其他终端工具一般不事先知道列数?
问题:与替换一些正则表达式\n
用sed
。
解决方法:类似的答案有很多[ 1 ][ 2 ][ 3 ][ 4 ],还有很多其他的链接我就不链接了。他们都建议你创建一个新标签:a
,合并行N
,分支到:a
if not end-of-file $!ba
,然后执行一些命令。
也就是说......
在GNU sed手册中,有一个-z
选项:
-z
--null-data
--zero-terminated
Treat the input as a set of lines, each terminated by a zero byte
(the ASCII ‘NUL’ character) instead of a newline. This option can
be used with commands like ‘sort -z’ and ‘find -print0’ to process
arbitrary file names.
Run Code Online (Sandbox Code Playgroud)
因此,首先,出于比较原因,如果我们尝试幼稚的方法:
$ seq 3 | sed 's/\n/ /g' …
Run Code Online (Sandbox Code Playgroud) 我有一个包含多个\ n实例的文件。
我想用实际的换行符替换它们,但是sed无法识别\ n。
我试过了
sed -r -e 's/\n/\n/'
sed -r -e 's/\\n/\n/'
sed -r -e 's/[\n]/\n/'
Run Code Online (Sandbox Code Playgroud)
以及其他多种转义方式。
sed是否能够识别文字\ n?如果是这样,怎么办?
是否有另一个程序可以读取将\ n解释为真实换行符的文件?