如何修改文本的每一行?

时间:2019-04-30 12:29:23

标签: linux bash

我有一个看起来像这样的文件(它可以多于2行):

$ cat /tmp/temp.txt 
;user1;1.1.1.1;DB1;SELECT;
;userX;2.2.2.2;DB4;SELECT;

我想这样更改它:

user: user1 address: 1.1.1.1 db: DB1 right: SELECT
user: userX address: 2.2.2.2 db: DB4 right: SELECT

我认为最简单的方法是使用read函数:

!/bin/bash

filename='/tmp/temp.txt'
while read ; do
  user=$(cut -d";" -f2 /tmp/temp.txt)
  address=$(cut -d";" -f3 /tmp/temp.txt)
  database=$(cut -d";" -f4 /tmp/temp.txt)
  right=$(cut -d";" -f5 /tmp/temp.txt)

 echo "user:$user address:$address database:$database right:$right"

done < $filename

脚本的输出为:

user:user1
userX address:1.1.1.1
2.2.2.2 database:DB1
DB4 right: SELECT
SELECT
user:user1
userX address:1.1.1.1
2.2.2.2 database:DB1
DB4 right: SELECT
SELECT

我希望输出的行数与输入文件中的行数相同。

4 个答案:

答案 0 :(得分:3)

只需使用awk

$ awk -F ';' '{ print "user:", $2, "address:", $3, "db:", $4, "right:", $5 }' your_file

这会将文件的每一行分割为分号,然后以所需的输出格式打印出所需的列。

答案 1 :(得分:1)

如果您希望坚持使用bash,则可以在正确的轨道上进行,但是您要做的工作太多:

filename='/tmp/temp.txt'
while read ; do
  user=$(cut -d";" -f2 /tmp/temp.txt)
  address=$(cut -d";" -f3 /tmp/temp.txt)
  database=$(cut -d";" -f4 /tmp/temp.txt)
  right=$(cut -d";" -f5 /tmp/temp.txt)

 echo "user:$user address:$address database:$database right:$right"

done < $filename
  1. 您正确地使用了while read; do ...; done < file类,但是您没有使用在循环中读取的数据。循环内有4个cut命令,因此您要为文件中的每一行处理整个文件4次。

  2. 没有任何变量名的
  3. read将数据存储在默认的$REPLY变量中。您可以

    filename='/tmp/temp.txt'
    while read ; do
      user=$(echo "$REPLY" | cut -d";" -f2)
      address=$(echo "$REPLY" | cut -d";" -f3)
      database=$(echo "$REPLY" | cut -d";" -f4)
      right=$(echo "$REPLY" | cut -d";" -f5)
      ...
    

    但是壳仍然可以使用外部命令来执行本机操作。

  4. 使用IFS变量来帮助您解析每一行:您拥有以分号分隔的数据,因此您可以执行以下操作:

    while IFS=";" read -r empty user address database right empty; do
        echo "user:$user address:$address database:$database right:$right"
    done < $filename
    

    请注意“空”变量占位符,以将数据保存在第一个分号之前和最后一个分号之后。

答案 2 :(得分:1)

使用sed,从左到右一一替换分号:

$ sed 's/;/user: /;s/;/ address: /;s/;/ db: /;s/;/ right: /;s/;//' infile
user: user1 address: 1.1.1.1 db: DB1 right: SELECT
user: userX address: 2.2.2.2 db: DB4 right: SELECT

答案 3 :(得分:0)

请您尝试以下。

01234