在分隔符上分割线,但只有两片

Split lines on separator but just two slices

我希望分隔符只工作一次,这样一行就可以只分成两部分。我用 = 作为分隔符尝试了一些 awk,但如果有第二个 =.

,它会将行分成三部分

给定文件 file.txt:

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

我在做:

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

我的目标是让 arg2 为 file.txt 取这些值中的每一个:

"text"
"book"
cat
"lineelrk="

我假设您使用 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=" --

这是一个awk

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

它删除了第一个 =

对于您所想的,这就是实现它的方式:

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

但这几乎可以肯定是错误的方法来做任何您想做的事情,您应该使用 awk 而不是 shell 循环。在这种情况下,您可以选择:

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

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