【问题标题】:How to get first word of every line and pipe it into dmenu script如何获取每行的第一个单词并将其通过管道传输到 dmenu 脚本
【发布时间】:2021-01-26 10:34:33
【问题描述】:

我有一个这样的文本文件:

first state
second state
third state

从每一行获取第一个单词并不难,但问题是在 dmenu 中添加分隔每个单词(选择)所需的额外 \n 时,根据其语法:

echo -e "first\nsecond\nthird" | dmenu

我无法弄清楚如何添加分隔符\n。我试过这个:

state=$(awk '{for(i=1;i<=NF;i+=2)print $(i)'\n'}' text.txt) 

但它不起作用。我也试过这个:

lol=$(grep -o "^\S*" states.txt | perl -ne 'print "$_"')

但同样的交易。不知道我做错了什么。

【问题讨论】:

  • 能否请您从每一行逐个确认第一个字段到 dmenu 脚本?或者您想一次将所有第一个字段传递给 dmenu?

标签: linux bash awk grep dmenu


【解决方案1】:

您的问题出在 AWK 脚本中。您需要将每个输入行标识为一条记录。这样,您可以通过 ORS 变量(输出记录分隔符)控制输出中每条记录的分隔方式。默认情况下,此分隔符是换行符,它应该足以满足您的目的。

现在要打印每个输入记录的第一个单词(在这种情况下是输入流中的每一行),您只需要打印第一个字段:

awk '{print $1}' textfile | dmenu

如果您需要输出包含显式 \n 字符串(不是控制字符),那么您可以覆盖 ORS 变量以满足您的需要:

awk 'BEGIN{ORS="\\n"}{print $1}' textfile | dmenu

【讨论】:

  • 我尝试了第一种方法,但由于某种原因,dmenu 需要它们明确。您的第二个示例有效,但只是没有转义换行符!不太清楚为什么,但这正是我需要的。谢谢!
【解决方案2】:

这可以在while 循环中更轻松地完成,请您尝试关注。这很简单,在读取文件的同时,它创建了 2 个变量,第一个变量名为 first,另一个是 rest,首先包含我们稍后传递给 dmenu 的第一个字段。

while read first rest
do
   dmenu "$first"
done < "Input_file"

【讨论】:

    【解决方案3】:

    基于文本文件示例,以下应该可以达到您的要求:

     awk '{ printf "%s\\n",$1 }' textfile | dmenu
    

    打印每行的第一个空格分隔字段以及 \n(需要对 \n 进行转义以阻止它被 awk 解释)

    【讨论】:

      【解决方案4】:

      在你的代码中

      state=$(awk '{for(i=1;i<=NF;i+=2)print $(i)'\n'}' text.txt)
      

      您试图在您的awk 代码中使用',但是代码是' 和紧随其后的' 之间的代码,因此代码是{for(i=1;i&lt;=NF;i+=2)print $(i),这不起作用。对于awk 代码中的字符串,您应该使用"

      如果您只想获得第 n 列 cut 在大多数情况下就足够了,让 states.txt 内容成为

      first state
      second state
      third state
      

      那么你可以这样做:

      cut -d ' ' -f 1 states.txt | dmenu
      

      说明:将空格视为分隔符(-d ' ')并获取第一列(-f 1

      (在 cut (GNU coreutils) 8.30 中测试)

      【讨论】:

        猜你喜欢
        • 2016-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        相关资源
        最近更新 更多