Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何用bash在文件中包装一个不带引号的地址?_Linux_Bash_Shell_Sed_Scripting - Fatal编程技术网

Linux 如何用bash在文件中包装一个不带引号的地址?

Linux 如何用bash在文件中包装一个不带引号的地址?,linux,bash,shell,sed,scripting,Linux,Bash,Shell,Sed,Scripting,在我的bash脚本中,由于某些原因,我一直试图获取一个没有用双引号括起来的文件地址,但没有成功,所以我的脚本将该地址作为一个令牌读取,并将该地址输入到包含地址的数组元素中。i、 我想要 巴什市巴什兰巷42号示例 成为 巴什市巴什兰巷42号示例 因此,我可以在脚本中将其分配给数组[4]。关于如何在没有双引号的地址周围使用双引号,有什么想法吗?它的.txt文件行结构如下: 姓氏姓氏dd/mm/yyyy地址 如何在没有双引号的地址周围加上双引号?我尝试了sed,但我似乎遇到了一个障碍,试图将未引用的地

在我的bash脚本中,由于某些原因,我一直试图获取一个没有用双引号括起来的文件地址,但没有成功,所以我的脚本将该地址作为一个令牌读取,并将该地址输入到包含地址的数组元素中。i、 我想要

巴什市巴什兰巷42号示例 成为

巴什市巴什兰巷42号示例 因此,我可以在脚本中将其分配给数组[4]。关于如何在没有双引号的地址周围使用双引号,有什么想法吗?它的.txt文件行结构如下:

姓氏姓氏dd/mm/yyyy地址 如何在没有双引号的地址周围加上双引号?我尝试了sed,但我似乎遇到了一个障碍,试图将未引用的地址作为脚本中的单个令牌进行处理。

尝试以下方法:

$ sed 's/\(.*[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\} \)\([^"]\)\(.*\)\([^"]\)$/\1"\2\3\4"/' <<< "John Doe 04/12/1960 42 Example Lane, Bash City, Bashland"  
John Doe 04/12/1960 "42 Example Lane, Bash City, Bashland"
编辑:

同样的结果,使用扩展正则表达式可能更具可读性:

sed -E 's/(.*[0-9]{2}\/[0-9]{2}\/[0-9]{4} )([^"])(.*)([^"])$/\1"\2\3\4"/' <<< 'John Doe 04/12/1960 42 Example Lane, Bash City, Bashland'
姓氏姓氏dd/mm/yyyy地址?两个名字或两个姓氏如何?LucyPU只对/yyy之后的零件感兴趣。 当你是新手时,从你理解的小步骤开始:

# Remove first part of string. In `sed` you can use `#`when `/` is part of your string.
echo "Mr John F Someone 11/04/2008 44 street somewhere" | sed 's#.*/.... ##'
# Put string in quotes
echo "Mr John F Someone 11/04/2008 44 street somewhere" | sed 's/.*/"&"/'
# Put string in quotes differently (for later study)
printf '"%s"\n' "$(echo "Mr John F Someone 11/04/2008 44 street somewhere")" 
# Combine two sed commands (after a pipe you can enter a newline)
echo "Mr John F Someone 11/04/2008 44 street somewhere" | 
   sed -e 's#.*/.... ##' -e 's/.*/"&"/'
# Or 
echo "Mr John F Someone 11/04/2008 44 street somewhere" | 
   sed 's#.*/.... ##;s#.*#"&"#'
# Or
echo "Mr John F Someone 11/04/2008 44 street somewhere" | 
   sed -e 's#.*/.... \(.*\)#"\1"#'

在bash中,您通常不需要或不希望在数据中使用引号。引号围绕着数据,而不是数据。您几乎应该总是在变量引用周围使用双引号,但几乎从不将任何类型的引号作为数据的一部分存储在变量中。但细节将取决于你到底在做什么。下面是一个简单的例子:

read firstName lastName date address <file.txt
# Note that if there are more space-separated "words" in the line than variables,
# `read` lumps everything into the last variable (i.e. address)
userArray=("$firstName" "$lastName" "$date" "$address")
# Double-quotes keep $address from being split into multiple array entries
echo "${userArray[0]} ${userArray[1]}'s address is:"
# Note that one set of double-quotes is enough to protect the whole string,
# even though there are multiple variable references in it.
echo "  ${userArray[3]}"
如果在文件上循环,可以使用以下内容:

while read firstName lastName date address; do
    # do stuff with the data
done <file.txt

顺便说一句,将不同类型的数据名称、日期等放入数组有点奇怪;通常使用数组存储相同类型的值列表。但同样,这取决于具体情况。

除非性能至关重要,否则Bash自己的read builtin提供了一个方便的解决方案:


该示例使用a代替文本输入文件;若要使用文件,请将其替换为听起来像是在编写shell脚本来处理文本。如果是这样,不要这样做,因为这不是贝壳的用途。shell用于操作文件/进程以及对工具的调用排序。用于处理文本的标准通用UNIX工具是awk。因此,如果您使用unixshell处理文本,那么shell部分应该只是对awk的调用。获取Arnold Robbins的《有效的Awk编程》一书,第四版,学习Awk并查看更多关于为什么不使用shell的信息。嗨,Ed,感谢您的反馈。我基本上是从一个输入文件中读取未解析的数据,并通过脚本按照输出规范将结果分发到一个创建的输出文件结构中。这里的操作问题是地址验证,read命令非常方便,但是如果address多字属性没有用引号括起来,因此被视为单个标记,那么第一个字地址就会从没有用引号括起来的地址中提取出来。这是我目前发展阶段的问题。为awk bro的提示干杯!!。。我将探索!!。。感谢大家的投入,我已经从解决方案中了解了负载,以及它们如何适用于我的部分构建脚本。正如SLePort所建议的,我将使用正则表达式作为最符合我脚本流程的工具!高登干杯。。我知道你是从哪里来的。我遇到的问题是,试图对我逐行读取文件输入的地址进行验证,然后声明并将其输入到数组中。数组不会以单个标记的形式完整读取地址,除非它有双引号,这是我的问题,并且需要对读取到数组元素中的行进行验证预处理。@JohnMulhall:在bash中设置数组的大多数方法都遵循我给出的规则:它们尊重数据周围的引号,但不尊重其中的引号。例如,如果您有raw_line='Joe Smith 11/22/33 42 example Lane Bash City Bashland',那么请声明-a foo=$raw_line,您将得到一个包含元素'Joe''Smith''11/22/33''42''example''Lane''Bash''City'和'Bashland'的数组,因为双引号在变量中而不是在它周围,它们只是数据的一部分,没有语法意义。明白了吗。。。谢谢戈登。。。。文件写入在没有引号的情况下可以工作到记录个人信息的单个文件夹文件…感谢您在这方面的帮助!这帮了大忙!!。。谢谢兄弟。。。这个正则表达式为我工作,我现在将额外的循环重新编码到我的脚本中,以清理分布式输出。
echo "Address='$address'" # Single-quotes around data
echo "Address=\"$address\"" # Double-quotes must be escaped inside other double-quotes
while read firstName lastName date address; do
    # do stuff with the data
done <file.txt
while read -r first last date addr; do
    [[ $addr == \"*\" ]] || addr="\"$addr\""
    echo "first: [$first], last: [$last], date: [$date], addr: [$addr]"
done <<'EOF'
First1 Last1 dd/mm/yyyy Address one unquoted
First2 Last2 dd/mm/yyyy "Address two double-quoted"
EOF
first: [First1], last: [Last1], date: [dd/mm/yyyy], addr: ["Address one unquoted"]
first: [First2], last: [Last2], date: [dd/mm/yyyy], addr: ["Address two double-quoted"]
while read -r first last date addr; do
    [[ $addr =~ \"(.*)\" ]] && addr="${BASH_REMATCH[1]}"
    echo "first: [$first], last: [$first], date: [$first], addr: [$addr]"
done <<'EOF'
First1 Last1 dd/mm/yyyy Address one unquoted
First2 Last2 dd/mm/yyyy "Address two double-quoted"
EOF
first: [First1], last: [First1], date: [First1], addr: [Address one unquoted]
first: [First2], last: [First2], date: [First2], addr: [Address two double-quoted]