如何获取每一行的第一个单词并将其通过管道传输到 dmenu 脚本中

How to get first word of every line and pipe it into dmenu script

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

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 "$_"')

但同样如此。不确定我做错了什么。

基于文本文件示例,以下内容应该可以实现您的要求:

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

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

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

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

awk '{print }' textfile | dmenu

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

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

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

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

在你的代码中

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

您试图在 awk 代码中使用 ',但是代码是 ' 和第一个 ' 之间的代码,因此代码是 {for(i=1;i<=NF;i+=2)print $(i)这是行不通的。对于 awk 代码中的字符串,您应该使用 "

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

first state
second state
third state

那么你可以这样做:

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

解释:将 space 视为分隔符 (-d ' ') 并获得第一列 (-f 1)

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