【问题标题】:Split lines on separator but just two slices在分隔符上分割线,但只有两片
【发布时间】:2015-05-10 19:46:12
【问题描述】:

我希望分隔符只工作一次,因此该行只能分成两部分。我尝试使用 awk 以 = 作为分隔符,但如果有第二个 =,它会将行分成三部分。

给定文件file.txt

first="text"
line="book"
red=cat
nice="lineelrk="

我在做:

cat file.txt | awk -F"=" '{print $1,$2}' | while read arg arg2
do 
echo "Read first user as $arg2"
done

我的目标是让arg2 将这些值分别用于 file.txt:

"text"
"book"
cat
"lineelrk="

【问题讨论】:

  • 不太清楚什么是最有代表性的标题,不过不会再碰了

标签: bash shell awk sh


【解决方案1】:

我假设您正在使用while read,因为您想对变量做一些事情,而不仅仅是打印它们。如果是这样的话,简单的awk 就足够了。

但是如果你想要一个带有内容的 bash 变量,你可以这样做:

您可以将= 设置为IFS(内部字段分隔符)并将read 与两个参数一起使用。这样,第一个切片将存储在第一个变量中,第二个变量将包含其余部分:

while IFS="=" read -r arg arg2
do 
    echo "Read first user as $arg2"
done < file.txt

如果您打算只使用第二个,您可以将第一个变量称为_(虚拟名称),这样您就可以清楚地看到您没有使用该信息:

$ while IFS="=" read -r _ arg; do echo "-- $arg --"; done < file.txt
-- "text" --
-- "book" --
-- cat --
-- "lineelrk=" --

【讨论】:

  • 很想知道,如果我只有一行 ex。 cat file.txt |grep -w "nice"。没有while循环怎么办?
  • @user1595858 然后你可以说类似while IFS=.... do ... done &lt; &lt;(grep -w "nice" file.txt)
【解决方案2】:

对于你认为你想要的,这将是实现它的方式:

$ cut -d= -f2- file | while IFS= read -r arg2; do echo "$arg2"; done
"text"
"book"
cat
"lineelrk="

但几乎可以肯定,无论你想要做什么,这都是错误的方法,你应该只使用 awk 而不是 shell 循环。在这种情况下,请选择:

$ awk '{name=value=$0; sub(/=.*/,"",name); sub(/[^=]+=/,"",value); print name ":" value}' file
first:"text"
line:"book"
red:cat
nice:"lineelrk="

$ awk 'match($0,/=/){name=substr($0,1,RSTART-1); value=substr($0,RSTART+1); print name ":" value}' file
first:"text"
line:"book"
red:cat
nice:"lineelrk="

【讨论】:

  • 不错的答案,但对 OPs 的要求有点矫枉过正
  • OP 几乎可以肯定要求我们帮助他实施错误的解决方案。
  • 对于您的第一个解决方案,最好使用while IFS= read -r arg2; do echo "$arg2"; done &lt; &lt;(cut -d= -f2- test),这样您就不会失去循环中变量的范围。正如您所说,OP 可能想做的事情比他们要求的要多.
  • idk,他可能对while IFS='=' read -r skip arg2; do ... 也很满意,根本不使用cut,但它仍然可能是错误的方法。
【解决方案3】:

这是awk

awk '{sub(/[^=]*=/,"")}1' file
"text"
"book"
cat
"lineelrk="

它删除所有直到第一个=

【讨论】:

  • Sed 可能更适合这个sed 's/[^=]*=//'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
相关资源
最近更新 更多