5

我想把一行分成单词。我知道这可以用这个来完成

For word in $line; do echo $word; done  

但我想组 3-3 个单词。所以我的问题是,如何将一行分成 3-3 个单词?

例如

Input : I am writing this line for testing the code.  

Output :  
I am writing
this line for
testing the code.  
4

7 回答 7

4

一次读三个单词。将要读取的行设置为余数:

while read -r remainder
do
    while [[ -n $remainder ]]
    do
        read -r a b c remainder <<< "$remainder"
        echo "$a $b $c"
    done
done < inputfile
于 2012-06-26T14:37:10.553 回答
3

粘贴命令呢

for word in $line; do echo $word; done | paste - - -
for word in $line; do echo $word; done | paste -d" " - - -
于 2012-06-26T13:04:18.970 回答
1

简单的正则表达式练习。

sed -e "s/\([^\ ]*\ [^\ ]*\ [^\ ]*\)\ /\1\\`echo -e '\n\r'`/g"

唯一棘手的部分是在 sed 中获取新行,因为没有标准。

$ echo "I am writing this line for testing the code."|sed -e "s/\([^\ ]*\ [^\ ]*\ [^\ ]*\)\ /\1\\`echo -e '\n\r'`/g"
I am writing
this line for
testing the code.

别客气。

于 2012-06-26T14:28:42.683 回答
1

只需使用set将您的输入设置为位置参数,并以三个为一组进行处理。这样你就不需要任何花哨或特定于 bash 的东西:

line="I am writing this line for testing the code."

set junk $line
shift
while [ $# -ge 3 ]; do
  echo "Three words: $1 $2 $3"
  shift 3
done
于 2012-06-26T15:58:49.797 回答
0

有一个非通用的直接解决方案:

#!/bin/bash
path_to_file=$1
while read line
do
counter=1;
    for word in $line
    do
        echo -n $word" ";
    if (($counter % 3 == 0))
      then
        echo "";
    fi
    let counter=counter+1;
    done
done < ${path_to_file}

将其保存在脚本中,为其命名(例如 test.sh)并将其设置为执行模式。如果您的文本保存在“myfile.txt”中,则像这样调用它:

test.sh myfile.txt
于 2012-06-26T12:42:04.607 回答
0

作为开始,您可以使用它,它将每个单词读入一个数组

#!/bin/bash

total=0
while read
do
    for word in $REPLY
    do
        A[$total]=$word
        total=$(($total+1))
    done
done < input.txt

for i in "${A[@]}"
do
    echo $i
done

下一步是使用seq或类似的方法循环遍历数组并以三个为一组进行打印。

于 2012-06-26T12:47:37.943 回答
0

这是可能解决方案的示例。

#!/bin/bash

line="I am writing this line for testing the code."


i=0
for word in $line; do
    ((++i))
    if [[ $i -eq 3 ]]; then
        i=0
        echo "$word"
    else
        echo -ne "$word "
    fi
done
于 2012-06-26T12:48:08.597 回答