我希望分隔符只能工作一次,因此该行只能分成两部分。我尝试使用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="
答案 0 :(得分:2)
我假设你正在使用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=" --
答案 1 :(得分: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="
答案 2 :(得分:0)
这是awk
awk '{sub(/[^=]*=/,"")}1' file
"text"
"book"
cat
"lineelrk="
删除所有前至=