在分隔符上分割线,但只有两片
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="
我希望分隔符只工作一次,这样一行就可以只分成两部分。我用 =
作为分隔符尝试了一些 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="