分隔线上的分割线,但只有两个切片

时间:2015-03-09 15:22:26

标签: bash shell awk sh

我希望分隔符只能工作一次,因此该行只能分成两部分。我尝试使用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="

3 个答案:

答案 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="

删除所有前至=