Questions tagged «sed»

sed是用于过滤和转换文本的命令行流编辑器。

4
使用grep提取()之前的字符
我需要提取字符'('之前的字符。我的文件结构是: 玫瑰(好)钩 雏菊()否 礼来的(坏的)罚款 美丽的向日葵 我需要以下形式的输出文件: rose daisy lilly sunflower 谁能告诉命令这个..... 最好使用awk,grep或sed ...
12 sed  awk  grep 

5
sed在FreeBSD和Linux上的行为不同吗?
我同时使用Linux和FreeBSD(特别是我使用Debian Linux和PC-BSD),但是我发现有些奇怪sed。 我经常需要将“制表符分隔值”文件转换为“逗号分隔值”。我知道的最简单的方法是使用sed,例如: sed 's/\t/,/g' inputFile.txt > outputFile.csv 这在Linux上完美运行:用逗号替换每个选项卡...但是在FreeBSD上,它什么也不会替换! 我想念什么吗?FreeBSD的语法sed是否不同于Linux上的语法?
12 sed  freebsd 

4
通过awk或sed按第一列连接行
awk在以下情况下如何使用? 我想连接以同一列开头的行。只有在加入第一列保持(在这种情况下aaa,www,hhh)。 文件可以用空格或制表符分隔。 输入示例: aaa bbb ccc ddd NULL NULL NULL aaa NULL NULL NULL NULL NULL NULL aaa bbb ccc NULL NULL NULL NULL www yyy hhh NULL NULL NULL NULL hhh 111 333 yyy ooo hyy uuuioooy hhh 111 333 yyy ooo hyy NULL 所需的输出: aaa bbb ccc …

8
交换无数列
我有一个带有列的文件。参见以下示例: a b c ... z 1 2 3 ... 26 我想交换所有列,其中第一列变成最后一列,第二列变成最后一列...等等。 z y x ... a 26 25 24 ... 1 是否有一个衬板(awk或sed)做到这一点? 我知道awk只有几个列时可以使用,但是我希望能够对具有数千个列的文件执行此操作。 tac做到完美的线条。 我想我正在寻找对应的列。 rev 不适用于我,因为它还会交换列中的内容。

4
仅当下一行不包含特定匹配项时才打印一行
我正在尝试在日志文件中搜索未完成的已记录活动。例如,我记录“ ID 1234的启动活动...”,如果成功,则下一行将为“ Activity 1234 Completed”。 我正在尝试获取“开始...”行,其后没有相应的“已完成”行。 日志文件示例 Starting activity for ID 1234 ID 1234 completed successfully Starting activity for ID 3423 ID 3423 completed successfully Starting activity for ID 9876 ID 9876 completed successfully Starting activity for ID 99889 ID 99889 completed successfully Starting activity for ID 10011 ID …
12 grep  sed  awk 

1
sed命令如何工作?
我遇到过用于从文本文件打印特定行的解决方案: sed '123!d;q' file 在这种情况下,为什么sed在输入的第一行之后不退出?
12 sed 

2
哪个sed版本不是GNU sed 4.0?
我试图找出sed在BusyBox 1.18.3上安装的哪个版本。该--version输出是神秘的。 $ sed --version This is not GNU sed version 4.0 以下代码来自相关代码sed.c。 /* Lie to autoconf when it starts asking stupid questions. */ if (argv[1] && !strcmp(argv[1], "--version")) { puts("This is not GNU sed version 4.0"); return 0; } 这是标题: /* * sed.c - very minimalist version of sed …
12 sed  version  busybox 

4
grep —删除定界符标记后的文本
我有一个文件,需要删除;每行第一行之后的所有内容。 所以这样的文件: sdfsdsdf; fsdfsddf;sdfsd; 将导致以下结果: sdfsdsdf fsdfsddf 我调查了grep和sed。我将不胜感激地结合了这两个命令中的任何一个。

3
如何仅显示列表的最后一行?
假设我列出了清单,并按其时间属性对文件进行了排序: ls -ltr -rwxrwxrwx 1 bla bla 4096 Feb 01 20:10 foo1 -rwxrwxrwx 1 bla bla 4096 Feb 01 20:12 foo2 . . . -rwxrwxrwx 1 bla bla 4096 Mar 05 13:25 foo1000 我应该在管道链中的ls -ltr之后添加什么,以便仅获得清单的最后一行?我知道有sed和awk,但我不知道如何使用它们,我只知道它们可以做什么。
12 command-line  sed  awk  ls 


2
如何保存复杂的正则表达式以在sed中多次重用?
在使用时sed,我经常创建相当复杂的正则表达式,我需要在一个文件中进行两次匹配。我有办法保存此正则表达式并仅引用它两次吗? 也许看起来像这样? sed ' complicated_regex=/^(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+$/ s/complicated_regex:complicated_regex/simple-output/ ' my_file 更新:一个答案提出了使用bash变量的解决方案。这行不通。给定一个test.txt。 #test.txt foo bar bar foo 和脚本 #!/bin/bash VALUE='foo \([a-z]\+\)' sed 's/"${VALUE}"/foo happy \1/' test.txt 这应该产生输出 foo happy bar bar foo 但是我得到了错误 sed: -e expression #1, char 24: invalid reference \1 on `s' command's RHS

5
sed无法删除换行符
我已经使用sed了一段时间了,但是这是我遇到的一个怪癖,我无法解决。 让我用实际情况解释我的问题。 场景#1 printf "ls" | xclip -selection clipboard echo "ls" | xclip -selection clipboard 在第一个命令中,我将printf输出传递到,xclip以便将其复制到剪贴板。现在,printf不同于echo默认情况下不会在末尾插入新行。因此,如果我将此内容粘贴到终端中,ls则复制的命令不会自动运行。 在第二行中,末尾有一个新行,因此粘贴剪贴板内容也会导致命令在剪贴板中运行。 这对我来说是不可取的。因此,我想使用来删除换行符sed,但失败了,如下图所示。 场景#2 echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard 剪贴板中的内容仍然包含换行符。当我将其粘贴到终端时,该命令将自动运行。 我还尝试删除回车符\r。但是娜达 似乎我在这里错过了非常关键/基本的东西。
12 sed  newlines 


2
命令删除输入中的前N行
背景 我正在运行SSH服务器,并且要删除此用户。我无法删除此用户,因为他当前正在运行一些我首先需要杀死的进程。 这是我当前正在使用的管道,以找出我当前正在使用的用户的所有进程ID: ps -u user | awk '{print $1;}' 输出看起来像这样: PID 2121 2122 2124 2125 2369 2370 我想用它kill -9杀死所有进程,所以我可以这样删除这个愚蠢的用户: ps -u user | awk '{print $1;}' | sudo xargs kill -9 但这由于PID标题而无法正常工作: kill: failed to parse argument: 'PID' 问题 我认为必须有一个简单的Unix命令才能删除输入的第一行。 我知道我可以使用tail它,但是我不想计算输入中包含多少行来准确地确定要显示的行数。 我正在寻找类似head或tail反转的内容(而不是仅显示流的第一部分/最后一部分,而是显示流的开始/结束以外的所有内容)。 注意 我设法通过简单地| grep [[:digit:]]在awk命令后添加来解决此问题,但是我仍在寻找删除文件第一行的方法,因为我认为在其他情况下这将非常有用。
11 command-line  sed  awk  tail  head 

1
POSIX sed对于地址范围从已删除的行开始的“ 1d; 1,2d”有什么要求?
在对这个问题的评论中,出现了一个案例,其中各种sed实现在一个相当简单的程序上存在分歧,而我们(或至少我)无法确定规范对它的实际要求。 问题是从删除行开始的范围的行为: 1d;1,2d 即使在到达该命令之前删除了范围的开头,也应该删除第2行吗?我最初的期望是与BSD sed一致,“否”,而GNU sed说“是”,并且检查规范文本并不能完全解决问题。 符合我期望的是(至少)macOS和Solaris sed以及BSD sed。(至少)GNU和Busybox意见不同sed,这里有很多人。前两个通过SUS认证,而其他两个可能更广泛。哪种行为是正确的? 两个地址范围的规范文本显示: 然后,sed实用程序应按顺序应用其地址选择该模式空间的所有命令,直到命令开始下一个周期或退出为止。 和 具有两个地址的编辑命令应从与第一个地址匹配的第一个模式空间到与第二个地址匹配的下一个模式空间选择包含范围。[...]从选定范围后的第一行开始,sed将再次寻找第一个地址。此后,应重复该过程。 可以说,第2行是 内,不管开始点是否已删除“从通过相匹配的第二下一图案空间匹配的第一个地址中的第一图案空间包容范围”。另一方面,我希望第一个d继续进行下一个周期,而不给该范围一个开始的机会。UNIX™认证的实现可以实现我期望的功能,但可能不会达到规范的要求。 一些说明性的实验遵循,但关键的问题是:什么应该 sed在范围上已删除的行开始呢? 实验与范例 这个问题的简化展示是,它打印行的额外副本而不是删除它们: printf 'a\nb\n' | sed -e '1d;1,2p' 这提供sed了两行输入,a和b。该程序执行两件事: 用删除第一行1d。该d命令将 删除模式空间并开始下一个循环。和 从1到2中选择行范围,并明确打印出来,除了自动打印每行接收到的内容。因此,该范围内的一行应出现两次。 我的期望是应该打印 b 仅,由于不应用该范围,因为1,2在第1行期间从未达到该范围(因为已经d跳至下一个循环/行),因此范围内的包含从未被开始,a而已被删除。通常,sed与macOS和Solaris 10 兼容的Unix会产生此输出,与sedSolaris和BSD sed中的非POSIX一样。 另一方面,GNU sed打印 b b 表示它已经解释了范围。这在POSIX模式下都不会发生。Busybox的sed具有相同的行为(但并非总是相同的行为,因此它似乎不是共享代码的结果)。 进一步的实验 printf 'a\nb\nc\nd\ne\n' | sed -e '2d;2,/c/p' printf 'a\nb\nc\nd\ne\n' | …
11 sed  posix 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.