打印模式第一次出现后的行文本,不包括模式 (OSX)

打印模式第一次出现后的行文本,不包括模式 (OSX)

下面是一个脚本,它打印删除“word”后“word”所在的整行文本,选择所有出现的“word”:

sed -ne 's/word//p'  file.txt >> newfile.txt

如何仅打印第一次出现“word”后的行文本,并删除打印行的“word”?

我正在使用 OSX。

这是示例文本:

Blalala 

'Omfoem From

balanf

word I want this output

word Not this output

Omfoem527

这是我期望的输出:

 I want this output

更新:这是我的脚本,它可以满足我的需要:

sed -n 's/^.*word //p'  file.txt > temp.txt
sed -n '1p' temp.txt >> newfile.txt
rm temp.txt

第一行打印删除“word”后“word”所在的整行文本,选择文件 temp.txt 中所有出现的“word”。我还添加了 ^.* 以防“word”之前有任何其他文本。
第二行仅将文件 temp.txt 的第一行打印到 newfile.txt 第三行删除 temp.txt 文件。

可能不是最有效的,但它确实有效。

答案1

尝试这个,

sed -n '/word/{n;p;q}' file
  • n -> 将下一行输入读取/附加到模式空间中。
  • p -> 打印当前模式空间。
  • q -> 立即退出 sed 脚本而不处理任何更多输入,仅第一次出现...

答案2

假设您只处理一个文件,该模式可能会发生仅在相关线路上一次,以下内容将起作用:

awk -F"word" 'NF>1 {print $2; exit}' file

这将使用模式“word”作为字段分隔符,并检查是否有多个这样的“字段”。如果是这样,则打印第二个字段(相当于后面的文本)word并停止执行。

如果你想处理多个文件,你可以使用

awk -F"word" 'NF>1 {print $2; nextfile}' file1 file2 ...

但这会不太便携(mawk例如不适用于)。

相关内容